我有一个通过多对多关系与另一个类集合相关的类列表。学生有很多角色。
我在 Student 类中的角色集上使用了 BatchSize(size=15),以防止每次对每个学生调用 getRoles() 时都会出现 N+1 问题。
我在数据库表中只有 15 个角色(因此 BatchSize 为 15)但是,在运行应用程序后我注意到 Hibernate 尝试预先加载 15 个角色,然后在我迭代时加载越来越多的角色学生的集合。
难道不明白所有这些角色都是一样的吗?并且只是在所有学生之间共享?这 15 个角色被多次带入 SessionContext。即使我预先通过单独的 HQL 查询加载了所有 15 个角色,当我对第一个学生调用 getRoles() 时,数据库仍然会被命中。
所以我将 BatchSize 设置为 1500 以允许 Hiberante 预先加载 AAAALLLL 角色。那也没有用。在第一个查询它加载 186 然后在第二个查询另一个 100 和 126 之后。3 db hits 优于 363(列表中的学生数),但仍然必须有更好的方法。
我的二级缓存已关闭,但我认为这与此无关。
感谢您的时间。