Игнориране на полета с JPA @ Transient Annotation

1. Въведение

Когато персистираме Java обекти в записи на база данни, използвайки рамка Object-Relational Mapping (ORM), често искаме да игнорираме определени полета. Ако рамката е съвместима с API за устойчивост на Java (JPA), можем да добавим анотацията @Transient към тези полета.

В този урок ще демонстрираме правилното използване на анотацията @Transient . Ще разгледаме и връзката му с вградената в Java преходна ключова дума.

2. @ Преходно пояснение срещу преходна ключова дума

Обикновено има известно объркване във връзката между анотацията @Transient и вградената преходна ключова дума на Java . В преходно ключовата дума е предназначена предимно за игнориране полета по време на Java обект сериализация, но също така пречи на тези полета от се продължава при използване на рамка на СПА.

С други думи, преходната ключова дума има същия ефект като анотацията @Transient при запазване в база данни. Въпреки това, @Transient анотация не засяга Java обект сериализация.

3. Пример за JPA @Transient

Да приемем, че имаме потребителски клас, който е JPA обект, който се съпоставя с таблица Users в нашата база данни. Когато потребителят влезе, ние извличаме неговия запис от таблицата Потребители и след това задаваме някои допълнителни полета в обекта Потребител след това. Тези допълнителни полета не съответстват на никакви колони в таблицата Потребители, защото не искаме да запазваме тези стойности.

Например ще зададем клеймо за време на обекта Потребител , който представлява кога потребителят е влязъл в текущата си сесия:

@Entity @Table(name = "Users") public class User { @Id private Integer id; private String email; private String password; @Transient private Date loginTime; // getters and setters }

Когато запазваме този потребителски обект в базата данни, използвайки JPA доставчик като Hibernate, доставчикът игнорира полето loginTime поради анотацията @Transient .

Ако сериализираме този потребителски обект и го предадем на друга услуга в нашата система, полето loginTime ще бъде включено в сериализацията. Ако не искахме да включим това поле, вместо това бихме могли да заменим анотацията @Transient с преходната ключова дума:

@Entity @Table(name = "Users") public class User implements Serializable { @Id private Integer id; private String email; private String password; private transient Date loginTime; //getters and setters }

Сега полето loginTime се игнорира по време на постоянството на базата данни и сериализацията на обекти.

4. Заключение

В тази статия разгледахме как правилно да използваме анотацията JPA @Transient в типичен случай на употреба. Не забравяйте да разгледате други статии за JPA, за да научите повече за постоянството.

Както винаги, пълният изходен код на статията е достъпен в GitHub.