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