6 ответов:
Java
transientключевое слово используется для обозначения того, что поле не должно быть сериализовано, тогда как JPA@Transientаннотация используется для указания на то, что поле не должно сохраняться в базе данных, т. е. их семантика различна.
потому что они имеют разные значения. Элемент
@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на всех.
цель по-другому:
The
transientключевого слова@Transientаннотации имеют две разные цели: одна имеет дело с сериализация и занимается настойчивость. Как программисты, мы часто объединяем эти две концепции в одну, но это не совсем точно. настойчивость относится к характеристике государства, которое переживает процесс, который его создал. сериализация в Java относится к процесс кодирования / декодирования состояния объекта в виде потока байтов.The
transientключевое слово является более сильным условием, чем@Transient:если поле использует
transientключевое слово, это поле не будет сериализовано, когда объект преобразуется в поток байтов. Кроме того, поскольку JPA обрабатывает поля, отмеченныеtransientключевое слово как@Transientаннотация, поле также не будет сохранено JPA.С другой стороны, поля с аннотациями
@Transientтолько будет преобразуется в поток байтов, когда объект сериализуется, но он не будет сохраняться JPA. Таким образом,transientключевое слово является более сильным условием, чем@TransientПримечание.пример
напрашивается вопрос: почему кто-то хочет сериализовать поле, которое не сохраняется в базе данных приложения? Реальность такова, что сериализация используется не только настойчивость. В корпоративном Java-приложении должно быть механизм обмена объектами между распределенными компонентами; сериализация предоставляет общий протокол связи для обработки этого. Таким образом, поле может содержать критическую информацию для целей межкомпонентной связи; но это же поле может не иметь значения с точки зрения сохранения.
например, предположим, что алгоритм оптимизации выполняется на сервере, и предположим, что этот алгоритм занимает несколько часов. Для клиента важно иметь самый современный набор решений. Так, клиент может подписаться на сервер и получать периодические обновления на этапе выполнения алгоритма. Эти обновления предоставляются с помощью
Если вы просто хотите, чтобы поля не сохраняются, как транзиторная и @ Transient работа. Но вопрос в том, почему @ Transient С транзиторная уже существует.
потому что @переходное поле все равно будет сериализовано!
предположим, что вы создаете объект, выполняя некоторые вычисления, потребляющие процессор, чтобы получить результат, и этот результат не будет сохранен в базе данных. Но вы хотите отправить объект в другой Java-приложения для использования JMS, то вы должны использовать
@Transient, а не ключевое слово JavaSEtransient. Таким образом, приемники, работающие на других виртуальных машинах, могут сэкономить время для повторного расчета.
Я постараюсь ответить на вопрос "почему". Представьте себе ситуацию, когда у вас есть огромная база данных с большим количеством столбцов в таблице, и ваш проект/Система использует инструменты для создания сущностей из базы данных. (У Hibernate есть такие и т. д...) Теперь предположим, что по вашей бизнес-логике вам нужно, чтобы определенное поле не сохранялось. Вы должны "настроить" свою сущность определенным образом. В то время как ключевое слово Transient работает с объектом - поскольку оно ведет себя в языке java, только @Transient предназначен для ответа на задачи, которые относятся только к задачам сохранения.
Comments