急切加载所有相关对象
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")
,否则另一个选项是更改字段 id
到 library_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 的情况下工作。我仍然愿意接受更好的解决方案。
我有两个实体:
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")
,否则另一个选项是更改字段 id
到 library_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 的情况下工作。我仍然愿意接受更好的解决方案。