Почему JPA имеет аннотацию @Transient?



Java имеет transientключевое слово. Почему у JPA есть @Transient вместо того, чтобы просто использовать уже существующее ключевое слово java?

1767   6  

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, а не ключевое слово JavaSE transient. Таким образом, приемники, работающие на других виртуальных машинах, могут сэкономить время для повторного расчета.

Я постараюсь ответить на вопрос "почему". Представьте себе ситуацию, когда у вас есть огромная база данных с большим количеством столбцов в таблице, и ваш проект/Система использует инструменты для создания сущностей из базы данных. (У Hibernate есть такие и т. д...) Теперь предположим, что по вашей бизнес-логике вам нужно, чтобы определенное поле не сохранялось. Вы должны "настроить" свою сущность определенным образом. В то время как ключевое слово Transient работает с объектом - поскольку оно ведет себя в языке java, только @Transient предназначен для ответа на задачи, которые относятся только к задачам сохранения.

Comments

    Ничего не найдено.