带有 Fetch 的 NHibernate QueryOver:解释多个 SQL 查询和数据库命中
尝试使用 NHibernate 的 QueryOver 检索实体并获取相关列表时语法上,开发人员可能会遇到大量冗余的 SQL 查询和数据库命中。使用急切获取时会出现此问题。
请考虑以下代码:
Session.QueryOver<UserRole>() .Fetch(x => x.UsersInRole).Eager .List();
此查询将导致一系列数据库命中,包括:
此行为源于 NHibernate 的急切获取策略。启用急切获取后,相关集合将与父实体一起立即加载。但是,每个相关对象可能具有需要检索的不同关联,从而导致额外的查询。
在提供的映射示例中,UserRole 和 UsersInRole 实体具有多对多关系。当急切获取具有此关系的 UserRoles 时,会话将仅包含有关检索到的 UserRole 的信息,而不包含其关联的 UsersInRole 的信息。
为了缓解此问题,应采用批量获取。通过在集合映射上设置 BatchSize 属性,NHibernate 将批量检索相关实体,而不是为每个关联对象执行单独的查询。
解决方案:
HasManyToMany(x => x.UsersInRole) ... .BatchSize(25)
为两个集合映射(包括类映射)分配批量大小可确保执行多个查询,而不是执行大量冗余查询。确切的查询数量将取决于批量大小和页面大小设置。
以上是为什么带有 Eager Fetching 的 NHibernate QueryOver 会导致多次数据库查询?的详细内容。更多信息请关注PHP中文网其他相关文章!