假设我在实体中具有持久属性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中使用Spring Boot。
最佳答案
如果通过调用EntityManager::persist
保留新实体,则描述的行为不会发生,并且在@PrePersist
方法中将显示瞬态字段。
但是,如果使用EntityManager::merge
持久存储新实体,则合并机制将忽略瞬态字段,这是预期的行为-仅合并Hibernate知道的属性。请记住,merge
始终返回一个副本(除非该参数已是托管实例),因此您必须手动将瞬态字段复制到merge
操作的结果中。