即使这些实体已经加载,多对多也会触发多方选择

时间:2014-04-24 17:26:35

标签: hibernate

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将在关联表上触发查询,以及该键是否已在会话中不触发查询。

1 个答案:

答案 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