Гибернация, хранящая производное свойство

#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().