1

我有一个实体,它包含几个基本字段 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 列,该列始终为空。如果这真的是唯一的方法,我可以忍受,但它似乎充其量是骇人听闻的。

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

4

2 回答 2

1

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

于 2012-08-27T14:48:59.220 回答
0

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

于 2013-06-01T03:11:36.243 回答