我有一个实体,它包含几个基本字段A,B和C以及一个复杂字段X,它不是(不应该)映射到数据库列。我们的想法是在加载实例时从A,B和C创建X,并在持久化时将X解构为A,B和C.
尝试的第一个合乎逻辑的事情是:
@Entity
class Xxx
{
private String a;
@Transient
private X x;
@PrePersist
public void prePersist()
{
XParts xp = x.deconstruct();
a = xp.getA();
//...
}
//...
}
问题是,当调用entityManager.merge(xxx)时; x丢失了。与JPA中如何处理@Transients有关。 @Transient和@PrePersist不要混用。好。我想不能与规范争论。
但是,有哪些替代方案?我真的不需要数据库中的X.
我能想到的最好的是:
@Column(insertable=false,updatable=false)
private X x;
创建列X,它始终为null。如果它真的是唯一的方式,我可以忍受它,但它似乎充其量只是hackish。
我不可能是遇到这个问题的唯一一个人。有没有更好的方法呢?
答案 0 :(得分:1)
JPA不提供任何PostMerge事件,但如果您使用EclipseLink,则可以定义一个DescriptorEventListener,它可以访问postMerge,允许您合并瞬态属性。
答案 1 :(得分:0)
我认为您使用@PreUpdate注释的“prePersist”方法可能会解决您的问题。你试过了吗?