文档章节

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

猪刚烈
 猪刚烈
发布于 2014/10/12 11:47
字数 660
阅读 9
收藏 0
点赞 0
评论 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提升性能

导读:   20.1. 抓取策略(Fetching strategies)   抓取策略(fetching strategy)是指:当应用程序需要在(Hibernate实体对象图的)关联关系间进行导航的时候, Hibernate如何获取关联对...

wsl_Mr ⋅ 2013/07/24 ⋅ 1

Hibernate缓存与集合性能分析

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

疯子船长 ⋅ 2015/10/26 ⋅ 0

hibernate N+1问题

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

毅屺 ⋅ 2016/03/20 ⋅ 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

cannot simultaneously fetch multiple bags 异常的解决办法

异常信息如下: org.hibernate.loader.MultipleBagFetchException: cannot simultaneously fetch multiple bags ...... 问题是什么时候出现的呢? 当一个实体对象中包含多于一个non-lazy获取...

liangtee ⋅ 2012/10/09 ⋅ 1

[Hibernate]一对多和多对一中各个参数的说明

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

彪大大 ⋅ 2016/01/22 ⋅ 0

hibernate 级联(cascade和inverse)

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

唏嘘猪肉佬 ⋅ 2013/06/13 ⋅ 0

Hernate的优化方案

【IT168 技术文档】 一、批量修改和删除 在Hibernate 2中,如果需要对任何数据进行修改和删除操作,都需要先执行查询操作,在得到要修改或者删除的数据后,再对该数据进行相应的操作处理。在...

晨曦之光 ⋅ 2012/03/09 ⋅ 0

Hibernate性能优化1( 转)

有很多人认为Hibernate天生效率比较低,确实,在普遍情况下,需要将执行转换为SQL语句的 Hibernate的效率低于直接JDBC存取,然而,在经过比较好的性能优化之后,Hibernate的性能还是让人相当...

九爷 ⋅ 2011/05/14 ⋅ 0

Hibernate4实战 之 第四部分:关系映射

数据表之间的关系分为三类:一对一、一对多、多对多 一对一数据表(部门表 和 部门主管表) 一对多数据表(部门表 和 部门下的人员表) 多对多数据表(部门表 和 人员表) 根据相互寻找的关系...

jinnianshilongnian ⋅ 2012/06/29 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

NFS介绍 NFS服务端安装配置 NFS配置选项

NFS介绍 NFS是Network File System的缩写;这个文件系统是基于网路层面,通过网络层面实现数据同步 NFS最早由Sun公司开发,分2,3,4三个版本,2和3由Sun起草开发,4.0开始Netapp公司参与并主导...

lyy549745 ⋅ 15分钟前 ⋅ 0

Spring AOP 源码分析 - 筛选合适的通知器

1.简介 从本篇文章开始,我将会对 Spring AOP 部分的源码进行分析。本文是 Spring AOP 源码分析系列文章的第二篇,本文主要分析 Spring AOP 是如何为目标 bean 筛选出合适的通知器(Advisor...

java高级架构牛人 ⋅ 38分钟前 ⋅ 0

HTML-标签手册

标签 描述 <!--...--> 定义注释。 <!DOCTYPE> 定义文档类型。 <a> 定义锚。超链接 <abbr> 定义缩写。 <acronym> 定义只取首字母的缩写。 <address> 定义文档作者或拥有者的联系信息。 <apple......

ZHAO_JH ⋅ 39分钟前 ⋅ 0

SylixOS在t_main中使用硬浮点方法

问题描述 在某些使用场景中,应用程序不使用动态加载的方式执行,而是跟随BSP在 t_main 线程中启动,此时应用代码是跟随 BSP 进行编译的。由于 BSP 默认使用软浮点,所以会导致应用代码中的浮...

zhywxyy ⋅ 47分钟前 ⋅ 0

JsBridge原理分析

看了这个Github代码 https://github.com/lzyzsd/JsBridge,想起N年前比较火的Hybrid方案,想看看现在跨平台调用实现有什么新的实现方式。代码看下来之后发现确实有点独特之处,这里先把核心的...

Kingguary ⋅ 59分钟前 ⋅ 0

Intellij IDEA神器常用技巧五-真正常用快捷键(收藏级)

如果你觉得前面几篇博文太啰嗦,下面是博主多年使用Intellij IDEA真正常用快捷键,建议收藏!!! sout,System.out.println()快捷键 fori,for循环快捷键 psvm,main方法快捷键 Alt+Home,导...

Mkeeper ⋅ 59分钟前 ⋅ 0

Java 静态代码分析工具简要分析与使用

本文首先介绍了静态代码分析的基本概念及主要技术,随后分别介绍了现有 4 种主流 Java 静态代码分析工具 (Checkstyle,FindBugs,PMD,Jtest),最后从功能、特性等方面对它们进行分析和比较,...

Oo若离oO ⋅ 今天 ⋅ 0

SpringBoot自动配置小记

spring-boot项目的特色就在于它的自动配置,自动配置就是开箱即用的本源。 不过支持一个子项目的自动配置,往往比较复杂,无论是sping自己的项目,还是第三方的,都是如此。刚接触会有点乱乱...

大_于 ⋅ 今天 ⋅ 0

React jsx 中写更优雅、直观的条件运算符

在这篇文字中我学到了很多知识,同时结合工作中的一些经验也在思考一些东西。比如条件运算符 Conditional Operator condition ? expr_if_true : expr_if_false 在jsx中书写条件语句我们经常都...

开源中国最帅没有之一 ⋅ 今天 ⋅ 0

vim编辑模式与命令模式

5.5 进入编辑模式 从编辑模式返回一般模式“Esc” 5.6 vim命令模式 命令 :“nohl”=no high light 无高亮,取消内容中高亮标记 "x":保存退出,和wq的区别是,当进入一个文件未进行编辑时,使...

弓正 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部