带有回调方法的JPA瞬态字段
我有一个实体,它包含几个基本字段A、B和C,还有一个复杂字段X,它没有(不应该)映射到数据库列。其思想是在加载实例时从A、B和C创建X,在持久化时将X分解为A、B和C 第一个合乎逻辑的尝试是:带有回调方法的JPA瞬态字段,jpa,Jpa,我有一个实体,它包含几个基本字段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()
@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有关@暂时的和@PrePersist不能混合。好啊我想,我不能与说明书争辩
但是,还有什么选择呢?我真的不需要数据库中的X
我能想到的最好办法是:
@Column(insertable=false,updatable=false)
private X x;
这将创建列X,该列始终为空。如果这真的是唯一的办法,我可以接受,但这充其量只是一种陈词滥调
我不可能是唯一遇到这个问题的人。有更好的方法吗?JPA不提供任何PostMerge事件,但是如果您使用EclipseLink,您可以定义一个DescriptorReventListener,它确实可以访问PostMerge,从而允许您合并瞬态属性。JPA不提供任何PostMerge事件,但是如果您使用EclipseLink,您可以定义一个DescriptorReventListener,它确实可以访问postMerge,从而允许您合并临时属性。我认为,您使用的相同的“prePersist”方法,但用@PreUpdate注释可能会解决您的问题。你试过了吗?我认为你用@PreUpdate注释的“prePersist”方法可以解决你的问题。您试过了吗?当您调用merge时,@PreUpdate annotation将是正确的调用方式。当您调用merge时,@PreUpdate annotation将是正确的调用方式。我只在hibernate中使用JPA,现在转到EclipseLink已经太晚了。还有其他建议吗?我只是在hibernate中使用JPA,现在转移到EclipseLink已经太晚了。还有其他建议吗?