0

結合テーブルで定義した 2 つのテーブル間に多対多の関係があります。

//MyClassA
@ManyToMany
@JoinTable(name="A_TO_B", 
           joinColumns=@JoinColumn(name="A_UUID"), 
           inverseJoinColumns=@JoinColumn(name="B_UUID")
)
private List<MyClassB> classBs = new ArrayList<MyClassB>();

//MyClassB
@ManyToMany(mappedBy="classBs")
private List<MyClassA> classAs = new ArrayList<MyClassA>();

会社のアーキテクチャの制限により、結合テーブルには UUID 列が必要です。

associateItems結合列に行を挿入するDAO メソッドが呼び出されました。すべてをテストするために、jUnit テストで次のことを行います。

myDao.associateItems(classAItem, classBItem);

classAItem = myDao.get(classAItem.getUuid());
classBItem = myDao.get(classBItem.getUuid());

assertEquals(1, classAItem.getClassBs().size());
assertEquals(1, classBItem.getClassAs().size());

このテストは、最後の 2 行で失敗します。

私の DAO では、多くのことを試しました。classAItemandをお互いのリストに追加してclassBItemマージしてみました。ただし、結合テーブル オブジェクトに UUID がないため、これによりエラーが発生します。そして、結合テーブルオブジェクトを作成してそれを永続化しようとしました。しかし、リストのサイズが 0 であると見なされるため、テストの最後の 2 行は失敗します。

私は2番目の解決策に固執しています(失敗はエラーよりも優れています)。

public void associateItems(MyClassA classAItem, MyClassB classBItem) {
    //UUID populated in constructor
    AToB association = new AToB(classAItem, classBItem); 
    entityManager.persist(association);
}

結合テーブル項目がデータベースに挿入されていることはわかっています。また、結合テーブル アイテムを手動で入力し、関連付けが見つかったときにリストが入力されるようにしました。したがって、このテストでは、結合テーブル アイテムを作成してから、関連するリストを関連付けることに問題があります。

カスケード、フェッチタイプ、フラッシュをいじってみました。しかし、テストに合格する方法を見つけることができないようです。

これを修正するために何をする必要があるか知っている人はいますか?

4

1 に答える 1

0

これは、実際にgetは DAO のメソッドの問題でした。以下のヒントを追加し、テスト実行に失敗しませんでした。

query.setHint(QueryHints.REFRESH, HintValues.TRUE);
于 2012-05-14T17:32:29.297 に答える