假设我在实体中有持久属性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启动。
答案 0 :(得分:1)
如果您通过调用EntityManager::persist
来保留新实体,那么您描述的行为将不会发生,并且@PrePersist
方法中会显示瞬态字段。
但是,如果您使用EntityManager::merge
持久化新实体,那么合并机制将忽略瞬态字段,这是预期的行为 - 只有Hibernate知道的属性才会被合并。请记住,merge
始终返回副本(除非参数已经是托管实例),因此您必须手动将临时字段复制到merge
操作的结果中。