«1. Введение

При сохранении объектов Java в записях базы данных с использованием инфраструктуры объектно-реляционного отображения (ORM) мы часто хотим игнорировать определенные поля. Если платформа совместима с Java Persistence API (JPA), мы можем добавить аннотацию @Transient к этим полям.

В этом руководстве мы продемонстрируем правильное использование аннотации @Transient. Мы также рассмотрим его связь со встроенным в Java ключевым словом transient.

2. Аннотация @Transient и ключевое слово 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
}

Когда мы сохраняем этот объект User в базе данных с помощью поставщика 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.