Перейти к основному содержимому

Игнорирование полей с аннотацией JPA @Transient

· 3 мин. чтения

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 .