1. Введение
При сохранении объектов Java в записях базы данных с использованием инфраструктуры объектно-реляционного сопоставления (ORM) мы часто хотим игнорировать определенные поля. Если платформа совместима с Java Persistence API (JPA), мы можем добавить аннотацию @Transient
к этим полям.
В этом руководстве мы продемонстрируем правильное использование аннотации @Transient
. Мы также рассмотрим его связь со встроенным в Java ключевым словом transient
.
2. @Transient
аннотация против переходного
ключевого слова
Как правило, существует некоторая путаница в связи между аннотацией @Transient
и встроенным ключевым словом переходного процесса
в Java . Ключевое слово transient
в первую очередь предназначено для игнорирования полей во время сериализации объектов Java , но оно также предотвращает сохранение этих полей при использовании среды JPA.
**Другими словами, ключевое слово transient
имеет тот же эффект, что и аннотация @Transient
при сохранении в базу данных. Однако аннотация @Transient
не влияет на сериализацию объектов Java.
**
3. Пример JPA @Transient
Допустим, у нас есть класс User , который представляет собой
сущность JPA , которая сопоставляется с таблицей Users в нашей базе данных. Когда пользователь входит в систему, мы извлекаем его запись из таблицы «Пользователи», а затем устанавливаем некоторые дополнительные поля в сущности « Пользователь ».
Эти дополнительные поля не соответствуют никаким столбцам в таблице Users, поскольку мы не хотим сохранять эти значения.
Например, мы установим отметку времени для объекта User
, которая представляет, когда пользователь вошел в свою текущую сессию:
@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
.
Если мы сериализуем этот объект User
и передадим его другой службе в нашей системе, поле loginTime
будет включено в сериализацию. Если бы мы не хотели включать это поле, мы могли бы заменить аннотацию @Transient ключевым словом
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 .