假设我在实体中具有持久属性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 Boot。

最佳答案

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

但是,如果使用EntityManager::merge持久存储新实体,则合并机制将忽略瞬态字段,这是预期的行为-仅合并Hibernate知道的属性。请记住,merge始终返回一个副本(除非该参数已是托管实例),因此您必须手动将瞬态字段复制到merge操作的结果中。

07-24 09:25