如何在持久化之前根据瞬态属性计算持久性属性?

时间:2016-09-02 14:52:48

标签: java hibernate jpa transient

假设我在实体中有持久属性A,并且有2个瞬态字段T1T2。当实体持久化时,我需要根据AT1来计算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的Spring启动。

1 个答案:

答案 0 :(得分:1)

如果您通过调用EntityManager::persist来保留新实体,那么您描述的行为将不会发生,并且@PrePersist方法中会显示瞬态字段。

但是,如果您使用EntityManager::merge持久化新实体,那么合并机制将忽略瞬态字段,这是预期的行为 - 只有Hibernate知道的属性才会被合并。请记住,merge始终返回副本(除非参数已经是托管实例),因此您必须手动将临时字段复制到merge操作的结果中。