0

私は2つのエンティティを持っています:

Book:

@Entity
public class Book {
    @Id
    private Long id;

    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "library_id")
    private Library library;
    // Getters and setters
}

Library:

@Entity
public class Library {
    @Id
    private Long id;

    @OneToMany(mappedBy = "library", fetch = FetchType.EAGER)
    private List<Book> books;
    // Getters and setters
}

私がやりたいことは、クエリされた特定のライブラリのすべての本を熱心に取得することです。

Library library = em.find(Library.class, 1L);
System.out.println(library.getBooks());

しかし、それは私に与えますnull。リンクされたすべての本のリストを取得するにはどうすればよいですか? SOから多くのソリューションを検索して試しましたが、どれも機能しません。

PS - テーブルにリンクされたデータが存在することを保証できます。

4

2 に答える 2

0

オブジェクトはデータベースではなくキャッシュからクエリされており、更新されたコピーではないことがわかりました。クエリを実行する前にキャッシュをクリーンアップしようとしたところ、次のように機能しました。

em.clear();

コンテキスト全体をクリアする代わりに、1 つのオブジェクトをデタッチして、再度クエリを実行することにしました。

em.getTransaction().begin();

Library library = new Library(1L, "Central library");
em.persist(library);

em.persist(new Book(1L, "Harry potter", "123-123-123-123", 1000, library));

em.getTransaction().commit();
em.detach(library);   // This did the trick

library = em.find(Library.class, 1L);
System.out.println(library.getBooks());

何らかの理由で、このハックなしで動作することを望みました。私はまだより良い解決策を受け入れています。

于 2017-03-25T19:12:21.310 に答える