hibernate之优化抓取(优化指导方针---笛卡尔积问题)

 

hibernate之优化抓取(优化指导方针---笛卡尔积问题)

 


 

笛卡尔积问题

与n+1查询问题相反的是抓取过多数据的SELECT语句。如果试图抓取几个"并行的"集合,少不了会出现这个笛卡尔积问题。假设你已经决定把一个全局的fetch="join"设置应用到Item的一个bids集合。Item类有其它的集合(例如images)。也假设你决定每件货品的所有图片都必须即时通过fetch="join"策略始终被加载:

 

如果通过一个即时的外部联结抓取策略映射两个并行的集合(它们自己的实体也一样),并加载所有的Item对象,Hibernate就执行一个创建这两个集合的乘积的SQL SELECT:

 

这个结果集包含大量多余的数据。

如果用fetch="subselect"映射这个并行的集合,就会得到3个查询:这就是对并行集合所建议的优化。然而,每一种规则都有例外。只要集合很小,乘积就可能是可以接受的抓取策略。注意,通过外部联结SELECT即时抓取的并行的单值关联一般不会产生乘积(也就是说,在使用fetch="join"时,在<many-to-one>,<one-to-one>这些单值关联的情况下,是不会产生笛卡尔积的,如果用在集合中,就会有笛卡尔积的现象。)

最后,虽然hibernate让你通过fetch="join"在2个(或者甚至更多个)并行的集合中创建笛卡尔积,但是如果你试图在并行的<bag>集合上启用fetch="join",它就会抛出异常。乘积的结果集无法被转化为包集合,因为hibernate无法知道哪些行包含有效重复以及哪些行不包含。如果使用包集合,就不启用导致乘积的抓取策略。给包集合的并行即时抓取使用子查询或者立即的二级查询抓取。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值