Java 如何在持久化之前基于瞬态属性计算持久化属性?
假设我在一个实体中有一个持久属性Java 如何在持久化之前基于瞬态属性计算持久化属性?,java,hibernate,jpa,transient,Java,Hibernate,Jpa,Transient,假设我在一个实体中有一个持久属性a,以及两个瞬态字段T1,T2。当实体被持久化时,我需要根据T1,T2(假设这是一个不能更改的遗留数据库)计算A 但是在prePersist()方法中,所有瞬态字段都被清除——它们被设置为初始值——这似乎是Hibernate/Jpa的正确行为 如何克服这个问题 我将Spring boot与Jpa和Hibernate一起使用。如果通过调用EntityManager::persist来持久化一个新实体,那么您描述的行为将不会发生,并且在@PrePersist方法中可以
a
,以及两个瞬态字段T1
,T2
。当实体被持久化时,我需要根据T1
,T2
(假设这是一个不能更改的遗留数据库)计算A
但是在prePersist()
方法中,所有瞬态字段都被清除——它们被设置为初始值——这似乎是Hibernate/Jpa的正确行为
如何克服这个问题
我将Spring boot与Jpa和Hibernate一起使用。如果通过调用
EntityManager::persist
来持久化一个新实体,那么您描述的行为将不会发生,并且在@PrePersist
方法中可以看到瞬态字段
但是,如果使用
EntityManager::merge
持久化一个新实体,则合并机制将忽略临时字段,这是预期的行为-仅合并Hibernate知道的属性。请记住,merge
始终返回一个副本(参数已经是托管实例时除外),因此必须手动将临时字段复制到merge
操作的结果中 你说得对。但是,我想对persit()和merget()执行转换。最后通过在setter方法中调用transform函数解决了这个问题。
@Entity
Class MyEntity {
@Column(name="persistantA")
Integer A;
@Transient
Integer T1;
@Transient
Integer T2;
@PrePersist
void prePersist() {
A = T1 * T2;
}
}