具有回调方法的JPA瞬态字段

时间:2012-08-27 02:51:14

标签: 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()
      {
      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。

我不可能是遇到这个问题的唯一一个人。有没有更好的方法呢?

2 个答案:

答案 0 :(得分:1)

JPA不提供任何PostMerge事件,但如果您使用EclipseLink,则可以定义一个DescriptorEventListener,它可以访问postMerge,允许您合并瞬态属性。

答案 1 :(得分:0)

我认为您使用@PreUpdate注释的“prePersist”方法可能会解决您的问题。你试过了吗?