Почему JPA имеет аннотацию @Transient?
Java имеет transient
ключевое слово. Почему JPA имеет @Transient
вместо того, чтобы просто использовать уже существующее ключевое слово java?
6 ответов
в Java transient
ключевое слово используется для обозначения того, что поле не должно быть сериализовано, тогда как JPA @Transient
аннотация используется для указания на то, что поле не должно сохраняться в базе данных, т. е. их семантика различна.
потому что они имеют разные значения. The @Transient
аннотация говорит поставщику JPA не сохранять никаких (не -transient
атрибут). Другой говорит структуре сериализации не сериализовать атрибут. Возможно, вы захотите иметь @Transient
свойство и все еще сериализует его.
как говорили другие,@Transient
используется для пометки полей,которые не должны сохраняться. Рассмотрим этот краткий пример:
public enum Gender { MALE, FEMALE, UNKNOWN }
@Entity
public Person {
private Gender g;
private long id;
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
public long getId() { return id; }
public void setId(long id) { this.id = id; }
public Gender getGender() { return g; }
public void setGender(Gender g) { this.g = g; }
@Transient
public boolean isMale() {
return Gender.MALE.equals(g);
}
@Transient
public boolean isFemale() {
return Gender.FEMALE.equals(g);
}
}
когда этот класс подается в JPA, он сохраняется gender
и id
но не пытается сохранить вспомогательные логические методы-без @Transient
базовая система будет жаловаться, что класс сущности Person
отсутствует setMale()
и setFemale()
методы и таким образом не сохраняются Person
на всех.
цель по-другому:
на transient
ключевого слова @Transient
аннотация имеет две разные цели: одна имеет дело с сериализация и занимается настойчивость. Как программисты, мы часто сочетаем эти две концепции в одну, но это не совсем точно. настойчивость относится к характеристике государства, которое переживает процесс, который его создал. сериализация в Java относится к процесс кодирования/декодирования состояния объекта в поток байтов.
на transient
ключевое слово является более сильным условием, чем @Transient
:
если поле использует transient
ключевое слово, это поле не будет сериализовано при преобразовании объекта в поток байтов. Кроме того, поскольку JPA обрабатывает поля, отмеченные transient
ключевое слово как @Transient
аннотация, поле также не будет сохраняться JPA.
С другой стороны, поля с аннотациями @Transient
только будет преобразуется в поток байтов при сериализации объекта, но он не будет сохраняться JPA. Следовательно,transient
ключевое слово является более сильным условием, чем @Transient
Примечание.
пример
возникает вопрос: почему кто-то хочет сериализовать поле, которое не сохраняется в базе данных приложения? Реальность такова, что сериализация используется не только для настойчивость. В корпоративном Java-приложении должно быть механизм обмена объектами между распределенными компонентами; сериализация предоставляет общий протокол связи для обработки этого. Таким образом, поле может содержать критическую информацию для целей межкомпонентной связи; но то же самое поле может не иметь ценности с точки зрения персистентности.
например, предположим, что алгоритм оптимизации выполняется на сервере, и предположим, что этот алгоритм занимает несколько часов. Для клиента важно иметь самый современный набор решений. Так, клиент может подписаться на сервер и получать периодические обновления на этапе выполнения алгоритма. Эти обновления предоставляются с помощью
Если вы просто хотите, чтобы поля не сохраняются, как транзиторная и @Transient работа. Но вопрос в том, почему @Transient С транзиторная уже существует.
потому что @Transient поле все равно будет сериализовано!
Предположим, вы создаете объект, делая некоторые вычисления, потребляющие процессор, чтобы получить результат, и этот результат не будет сохранен в базе данных. Но вы хотите отправить сущность другому Java-приложения для использования JMS, тогда вы должны использовать @Transient
, не ключевое слово JavaSE transient
. Таким образом, приемники, работающие на других виртуальных машинах, могут сэкономить время для повторного вычисления.
Я постараюсь ответить на вопрос "почему". Представьте себе ситуацию, когда у вас есть огромная база данных с большим количеством столбцов в таблице, и ваш проект/Система использует инструменты для создания сущностей из базы данных. (У Hibernate есть такие и т. д...) Теперь предположим, что по вашей бизнес-логике вам нужно, чтобы определенное поле не сохранялось. Вы должны "настроить" свою сущность определенным образом. Хотя Ключевое слово Transient работает на объекте-поскольку оно ведет себя в языке java, @Transient только предназначен для ответа на задачи, относящиеся только к задачам сохранения.