Почему 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 только предназначен для ответа на задачи, относящиеся только к задачам сохранения.