2016-12-14 10 views
0

私達持っている私たちは、新しいBエンティティを追加したい、次のエンティティ階層とエンティティリスナーでEntityListenerEnversは - EntityListener @PreUpdateにoneToManyコレクションに新しい要素を追加

@Entity 
@EntityListeners(value = DummyListener.class) 
@Audited 
public class A { 
@OneToMany(cascade = CascadeType.ALL, mappedBy = "a", fetch = FetchType.LAZY, orphanRemoval = true) 
    @Fetch(FetchMode.SELECT) 
    private Set<B> bs = new LinkedHashSet<B>(0); 
} 

@Entity 
@Audited 
public class B { 
    @ManyToOne(fetch = FetchType.EAGER, cascade = { CascadeType.MERGE, CascadeType.PERSIST }) 
    @JoinColumn(name = "a_id", nullable = false) 
    private A a; 
} 

public class DummyListener { 
    @PreUpdate 
    public void beforeUpdate(A entity) { 
    entity.set...(...); 

    ... 

    B old = entity.getBs().iterator().next(); 
    old.set...(...); 

    ... 

    B b = new B(); 
    b.setA(entity); 

    entity.getBs().add(b); 
    ... 
    } 

}

エンティティコレクション。しかし、Aを保存した後、エンバーはB監査テーブルの新しいBインスタンスの監査レコードを作成しませんでした。 他のすべての変更には、新しいBインスタンスを除く監査レコードがあります。

何が間違っていますか?このようにしてBの新しいインスタンスを作成することは可能ですか? JPA仕様2.1当たり

答えて

1

:一般に

、ポータブルアプリケーションのライフサイクル方法は、EntityManagerのまたはクエリ操作を呼び出す他のエンティティインスタンスにアクセスし、または同じ永続コンテキスト内の関係を変更してはなりません。ここ

ポイントは、新しいBを追加しAにそれを関連付けることにより、あなたは新しいエンティティBはいえ、エンティティ間の関係を修正している意味です。だから、次のコードを取って

:そのはのライフサイクルコールバックの中に作成したときにちょうどHibernateと無監査でこれをテストする場合は、あなたがBの新しいインスタンスがさえないことに気づくだろう

@PreUpdate 
public void onPreUpdate(Object object) { 
    if (object instanceof A) { 
    final A a = (A) object; 
    final B b = new B(); 
    b.setA(a); 
    a.getBs().add(b); 
    } 
} 

が持続しました​​。

したがって、Hibernateがこのようなユースケースを許可しない場合、Enversが状態の変化を検出して必要な収集作業ユニットを実行することさえできません。

+0

お返事ありがとうございます!また、私はJPAの文書化の答えを得たので、トリガーのようなメソッドを作成する別の方法を見つけるか、またはロジックを別のサーバー側のイメージメートに移動する必要があります。 – SeniorRoland

関連する問題