@Transient

jakarta.persistence.Transient исключает поле или property из JPA-маппинга.

@Transient
public Money getTotal() {
    return lines.stream()
        .map(Line::amount)
        .reduce(Money.ZERO, Money::add);
}

Это отличается от ключевого слова Java transient:

  • @Transient относится к сохранению через JPA;
  • transient относится к стандартной Java-сериализации;
  • сериализаторы JSON имеют собственные правила.

При field access поле с Java transient обычно не сохраняется по правилам JPA, но явная @Transient лучше передаёт намерение и не смешивает две модели.

Что хранить как transient

  • вычисляемое представление;
  • кэш результата, который можно восстановить;
  • внедрённый технический объект;
  • поле DTO-подобного назначения, если сущность временно его содержит.

Если значение нужно искать, сортировать или использовать в ограничениях БД, вычисление только в Java недостаточно. Возможны вычисляемый столбец, формула провайдера или явная проекция.

Вопросы для повторения

  1. @Transient скрывает поле от JSON? Нет.
  2. Java transient и JPA @Transient одно и то же? Нет.
  3. Можно ли менять transient-поле managed-сущности? Да, но само оно не вызовет SQL update.
  4. Когда вычисляемое значение лучше хранить в БД? Когда оно участвует в запросах, индексах или должно быть единообразно для разных клиентов.

Связано: Аннотация Access, Аннотация Basic.