@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 недостаточно. Возможны вычисляемый столбец, формула провайдера или явная проекция.
Вопросы для повторения
@Transientскрывает поле от JSON? Нет.- Java
transientи JPA@Transientодно и то же? Нет. - Можно ли менять transient-поле managed-сущности? Да, но само оно не вызовет SQL update.
- Когда вычисляемое значение лучше хранить в БД? Когда оно участвует в запросах, индексах или должно быть единообразно для разных клиентов.
Связано: Аннотация Access, Аннотация Basic.