1

いくつかの基本フィールド A、B、および C と、データベース列にマップされていない (すべきではない) 1 つの複雑なフィールド 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); を呼び出すときです。×は失われました。@Transients が JPA で処理される方法と関係があります。@Transient と @PrePersist は混在しません。Ok。私が推測する仕様と議論することはできません。

しかし、代替手段は何ですか?データベースに X は本当に必要ありません。

私が思いつくことができる最高のものは次のとおりです。

    @Column(insertable=false,updatable=false)
    private X x;

これにより、常に null である列 X が作成されます。それが本当に唯一の方法なら、私はそれを受け入れることができますが、それはせいぜいハックのようです.

この問題に遭遇したのは私だけではありません。これを行うより良い方法はありますか?

4

2 に答える 2

1

JPA は PostMerge イベントを提供しませんが、EclipseLink を使用している場合は、一時属性をマージできるようにする postMerge にアクセスできる DescriptorEventListener を定義できます。

于 2012-08-27T14:48:59.220 に答える