user(m:m)books
class user::
@ManyToMany
@BatchSize(size=100)
public List<Book> books;
loadAllActiveUsers()
foreach user
do(user.books)
假设user1有书籍(1-5),而user2有相同的书籍。
当你调用user.books时,即使这些书已经加载,hibernate也会触发加载书的完整查询。 Hibernate不会对这些数据做任何事情,因为实体已经在会话中,但当book是“大实体”时,当你加载大量用户而不是冗余提取成为性能问题时。
我希望有一种方法可以定义hibernate将在关联表上触发查询,以及该键是否已在会话中不触发查询。
答案 0 :(得分:0)
预期。
假设我加载用户&#34; John&#34;第一。约翰拥有书籍和白痴#34;和&#34;哈姆雷特&#34;。现在我加载用户&#34; Mary&#34;。 Hibernate如何知道Mary拥有哪些书籍?也许她拥有Moby Dick,也许不是。也许她拥有哈姆雷特,也许不是。也许她拥有200本书,也许不是。所以Hibernate执行一个查询来加载Mary拥有的所有书籍。如果Mary碰巧拥有一本先前已加载的书,那么本书中只会有一本本书存在。
如果您愿意,可以在一个查询中加载带有图书的用户:
select u from User u left join fetch u.books