文档章节

为什么Hibernate不允许同时抓取两个和两个以上的平行bag集合

猪刚烈
 猪刚烈
发布于 2014/10/12 11:47
字数 660
阅读 9
收藏 0

在hibernate中, 如果试图同时抓取两个或两个以上平行的bag集合,会抛出这个异常:org.hibernate.HibernateException: cannot simultaneously fetch multiple bags。对于这种情况,Hibernate文档给出的解释是: The resultset of a product can’t be converted into bag collections, because Hibernate can’t know which rows contain duplicates that are valid (bags allow duplicates) and which aren’t.

这里具体再解释一下。我们知道:抓取平行集合会产生笛卡尔积, 是笛卡尔积就会有重复记录。这对于允许有重复记录的bag集合有麻烦了,因为hibernate无法区分(确实地说是bag集合无法区分)这些重复的记录是因笛卡尔积而产生的(如果是这种记录,在封装对象是就要排除出去)还是真正的记录。注意:Hibernate不会通过比较ID来确定它们是否重复的,因为集合内的元素不一定都有ID的,比如值对象。 这也正是idbag为什么不存在这个问题的原因所在!在这种情况下,如果hibernate不抛出异常,就只能向bag集合中添加这些元素,而bag集合是允许重复记录的,这样,bag集合就会照单全收。对于set集合就不会出现这种情况,因为在添加对象时,它会检查是否已经加过这个元素了,重复的元素就会被排除出去。从这里我们也应该注意到:对于Set集合内的元素,重写hashCode和equals方法是多么地重要!

举个例子吧:对象A有一个B的bag集合和一个C的bag集合。假定a1有一个b1和b2组成的B集合,和一个c1组成的C集合,那么当使用join平行抓取B和C集合时,生成的结果集是:

a1,b1,c1

a1,b2,c1

现在,当hibernate将这个结果集封装成a1对象时,对于a1的C集合,hibernate首先将第一条记录中的c1加到集合里,当遇到第二条记录的c1时,因为C集体是一个bag集合,它不做检查就会接受这个c1.这就是问题的所在。即使这两个c1所有值全都是一样的,也包括ID,但是将之封装为对象加入C集合时,它是不做检查的。如果是set集合,它会检查它们的hashCode和equals方法,通过比较主键或业务主键,来确定它们是不是重复的。

本文转载自:http://blog.csdn.net/bluishglc/article/details/5579132

共有 人打赏支持
猪刚烈
粉丝 22
博文 708
码字总数 110
作品 1
海淀
程序员
Hibernate缓存与集合性能分析

Hibernate作为一个应用级的数据访问层封装,只能在其作用范围内保持cache中数据的有效性,如果系统与第三方系统共享数据库的情况下,Hibernate的Cache机制可能失效。 Hibernate在本地JVM中维...

疯子船长
2015/10/26
0
0
hibernate N+1问题

Hibernate N+1 问题及解决办法 问题出现的原因: Hibernate 中常会用到 set , bag 等集合表示 1 对多的关系,在获取实体的时候就能根据关系将关联的对象或者对象集取出,还可以设定 cacade...

毅屺
2016/03/20
77
0
EJB持久层cannot simultaneously fetch multiple bags异常的解决

病理特征:Caused by: org.hibernate.HibernateException: cannot simultaneously fetch multiple bags, 堆栈信息:org.springframework.beans.factory.BeanCreationException: Error crea......

曹_翔
2011/01/04
0
0
hibernate 级联(cascade和inverse)

级联(Cascade) : 二个以上的设备通过某种方式连接起来,能起到扩容的效果就是级联。Hibernate级联(Cascade)是用来说明数据库中两个表之间相互关系(一对一,一对多,多对多)中,当对主对象...

唏嘘猪肉佬
2013/06/13
0
0
[Hibernate]一对多和多对一中各个参数的说明

many-to-one节点有以下属性(摘自Hibernate文档): 序号 属性 说明 1 name 属性名 2 column (可选): 外间字段名。它也可以通过嵌套的 <column> 元素指定。 3 class (可选 - 默认是通过反射得...

彪大大
2016/01/22
65
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

python3.6 取余运算

python中取余运算逻辑如下: 如果a 与d 是整数,d 非零,那么余数 r 满足这样的关系: a = qd + r , q 为整数,且0 ≤ |r| < |d|。 经过测试可发现,python3.6中取余运算得到的 r 是正整数;...

colinux
11分钟前
1
0
[雪峰磁针石博客]软件测试专家工具包1web测试

web测试 本章主要涉及功能测试、自动化测试(参考: 软件自动化测试初学者忠告) 、接口测试(参考:10分钟学会API测试)、跨浏览器测试、可访问性测试和可用性测试的测试工具列表。 安全测试工具...

python测试开发人工智能安全
今天
3
0
JS:异步 - 面试惨案

为什么会写这篇文章,很明显不符合我的性格的东西,原因是前段时间参与了一个面试,对于很多程序员来说,面试时候多么的鸦雀无声,事后心里就有多么的千军万马。去掉最开始毕业干了一年的Jav...

xmqywx
今天
3
0
Win10 64位系统,PHP 扩展 curl插件

执行:1. 拷贝php安装目录下,libeay32.dll、ssleay32.dll 、 libssh2.dll 到 C:\windows\system32 目录。2. 拷贝php/ext目录下, php_curl.dll 到 C:\windows\system32 目录; 3. p...

放飞E梦想O
今天
1
0
谈谈神秘的ES6——(五)解构赋值【对象篇】

上一节课我们了解了有关数组的解构赋值相关内容,这节课,我们接着,来讲讲对象的解构赋值。 解构不仅可以用于数组,还可以用于对象。 let { foo, bar } = { foo: "aaa", bar: "bbb" };fo...

JandenMa
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部