急切加载所有相关对象

Eagerly load all the related objects

我有两个实体:

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。我如何获得所有链接书籍的列表?我搜索并尝试了 S.O 中的许多解决方案。但是 none 有效。

P.S。 - 我可以向您保证,表中存在链接数据。

问题出在 @JoinColumn(name = "library_id") 上,因为您没有 library_id 列,而是将其更改为 @JoinColumn(name = "id"),否则另一个选项是更改字段 idlibrary_id 里面 Library class.

您似乎没有将实体 class 映射到 table 列名称(因为它们具有不同的名称),您需要使用 @Column 映射它们如下图:

    @Entity
    public class Book {
        @Id
        @Column(name="book_id")
        private Long id;

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



    @Entity
    public class Library {
       @Id
       @Column(name="library_id")
        private Long id;

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

原来对象是从缓存而不是数据库中查询的,而且它不是更新的副本。当我尝试在查询之前清理缓存时,它起作用了:

em.clear();

我想与其清除整个上下文,不如分离一个对象并再次查询它。

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());

出于某种原因,我希望它在没有这个 hack 的情况下工作。我仍然愿意接受更好的解决方案。