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

带有回调方法的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()

我有一个实体,它包含几个基本字段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有关@暂时的和@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已经太晚了。还有其他建议吗?