2016-09-02 7 views
2

Скажем, у меня есть постоянное свойство A в сущности и 2 переходных поля T1, T2. Когда объект сохраняется, мне нужно вычислить A на основе T1, T2 (предположим, что это устаревшая база данных, которая не может быть изменена).Как вычислить постоянное свойство на основе свойства переходного процесса до его сохранения?

@Entity 
Class MyEntity { 
    @Column(name="persistantA") 
    Integer A; 

    @Transient 
    Integer T1; 

    @Transient 
    Integer T2; 

    @PrePersist 
    void prePersist() { 
     A = T1 * T2; 
    } 
} 

Однако внутри метода prePersist() все переходные поля очищаются --- они устанавливаются в исходное значение --- и это, кажется, правильное поведение для Hibernate/JPA.

Как преодолеть это?

Я использую весенний ботинок с Jpa и Hibernate.

ответ

1

Если вы сохраняете новый объект, вызывая EntityManager::persist, то описанное вами поведение не произойдет, и переходные поля будут видны в методе @PrePersist.

Однако, если вы сохраняете новый объект с EntityManager::merge, тогда механизм слияния будет игнорировать переходные поля, что является ожидаемым поведением - только свойства, о которых известно Hibernate, объединяются. Имейте в виду, что merge всегда возвращает копию (за исключением случаев, когда аргумент уже является управляемым экземпляром), поэтому вам нужно скопировать временные поля вручную в результат операции merge.

+0

Вы правы. Однако я хочу выполнить преобразование для persit() и merget(). Я решил эту проблему, вызвав функцию преобразования в методе setter. – xing

 Смежные вопросы

  • Нет связанных вопросов^_^