#java #hibernate
#java #гибернация
Вопрос:
У меня есть класс, сохраняемый Hibernate с производным свойством isComplete
.
@Entity
class Container {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column
private Long id;
@Column private String oneFish;
@Column private String twoFish;
@Column private String redFish;
@Column private String blueFish;
public Boolean isComplete(){
return oneFish != null
amp;amp; twoFish != null
amp;amp; redFish != null
amp;amp; blueFish != null;
}
}
Как мне заставить режим гибернации сохранять IsComplete в базе данных, чтобы другой доступ (не в режиме гибернации) мог видеть значение?
Комментарии:
1. Вот аналогичный вопрос с форума hibernate, они предлагают вычислить его в коде Java, а не сохранять его отдельно. forum.hibernate.org/viewtopic.php?f=1amp;t=960065
2. если вы вычисляете его в коде Java, оно не может быть проиндексировано базой данных
Ответ №1:
Если вы аннотировали метод с помощью @Column
, он будет сохранен (возможно, вам придется указать @AccessType
/ @Access
для объекта)
Но вы не должны этого делать. Сохраняйте все остальные значения и вычисляйте isComplete
всякий раз, когда вам это нужно. Это не дорогостоящая операция. Вы даже можете «кэшировать» его в @Transient Boolean
свойстве, но для этого не обязательно передавать его в базу данных.
Комментарии:
1. Я хочу, чтобы оно отправлялось в базу данных, в этом суть. Я хочу, чтобы этот производный столбец был в базе данных.
2. почему? Вы создаете много потенциальных проблем с этим (в любом случае, мой первый абзац отвечает на ваш вопрос)
3. Как сказал Пол, это в интересах других потребителей данных в базе данных, которые являются приложениями, не выполняющими его код. Вычисление полноты — это логика домена (хотя, по-видимому, очень простая логика домена); реализация ее каждым потребителем привела бы к дублированию, а вместе с ним и к риску целого класса ошибок.
4. с другой стороны, это означало бы, что вы всегда должны пересчитывать производное значение, если какое-либо из других изменяется. Что, я думаю, потенциально может привести к большему количеству ошибок.
Ответ №2:
Я использую XML-сопоставления в режиме гибернации, но если я правильно понимаю аннотации в режиме гибернации, вы можете аннотировать IsComplete() как @Column и предоставить ничего не делающий параметр setComplete().