0

次のようなエンティティがあります。

public User {
    @OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
    @JoinColumn(name = "user_id", insertable = true, updatable = true)
    @ElementDependent
    private List<Item_x> item_x_list = new ArrayList<Item_x>();
}

public Item_x {
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "user_id", insertable = true, updatable = true)
    @Element(name = "user_id", required = false)
    private Users user;
}

User.item_x_list にアイテムを追加/削除してから、em.merge(User.INSTANCE) を使用して User エンティティを永続化すると、Item_x.user プロパティが NULL になります。

JOIN FETCH クエリを使用して Item_x.user プロパティをロードし、属性がロードされていることを確認しています (必要な場合)。ただし、ユーザーエンティティでマージを実行した場合、FETCH JOIN を使用しても Item_x.user プロパティは NULL になります。

Item_x.INSTANCE をリフレッシュして回避しようとしましたが、呼び出すと:

em.refresh(Item_x.Instance);

=> ユーザーが null です。

データベースを見ると、もちろん、ユーザーが Item_x で null ではないことがわかります。

OpenJPA に Item_x でユーザーを正しくロードさせるにはどうすればよいですか? OpenJPA が Item_x.user プロパティを正しく入力しない/JOIN FETCH ステートメントを無視するのはなぜですか?

4

1 に答える 1

1

問題は、双方向の関係ではなく、2つの単方向の関係を作成したことのようです。クラスの1つは、他のクラスへのmappedByリレーションを定義する必要があります。これにより、他のクラスがリレーションの「所有者」として定義されます。たとえば、上記の例を変更して、Item_xを所有者として次のように定義できます。

public User {
    @OneToMany(targetEntity = Item_x.class, mappedBy = "user", fetch = FetchType.EAGER, cascade = CascadeType.ALL)
    @ElementDependent
    private List<Item_x> item_x_list = new ArrayList<Item_x>();
}

public Item_x {
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "user_id", insertable = true, updatable = true)
    @Element(name = "user_id", required = false)
    private Users user;
}

OpenJPAのドキュメントでより多くの情報が利用可能ですが、より明確にするための例が欠落しています。

于 2012-10-05T03:38:57.027 に答える