У меня есть некоторое философское интуитивное ощущение, что добавление полей, которые не отображаются в БД, портит классы сущностей и является неправильным способом решения проблем.
Но существуют ли какие-либо конкретные ситуации, когда использование @Transient
полей приводит к неявным и трудно решаемым проблемам?
Например, возможно ли, что добавление или удаление кеша 2-го уровня нарушит работу нашего приложения, если в наших сущностях есть @Transient
поля?
Значительное обновление: после некоторого размышления над @Transient
полями мне кажется, что @Transient
поля просто нужно использовать должным образом.
Под «правильным способом» я подразумеваю, что сущность всегда должна вести себя одинаково. Это означает, что это очень подвержено ошибкам поведение, когда геттеры время от времени возвращают null
в зависимости от значения поля @Transient. А это значит, что поля @Transient всегда нужно инициализировать.
И я вижу только 2 случая правильного использования:
Поля @Transient должны быть инициализированы в конструкторе объекта:
@Entity public class SomeEntity @Id private long id; @Transient private String transientField; public SomeEntity () { transientField = "some string"; } ... }
Поля @Transient могут быть инициализированы лениво:
@Entity public class SomeEntity @Id private long id; @Transient private String transientField; public String getTransientField () { synchronized (lock) { if (transientField == null) { transientField = "some string"; } } return transientField; } ... }
Может ли кто-нибудь прокомментировать эти 2 случая или описать другие случаи, которые я пропустил?