`
- 浏览:
950 次
- 性别:
- 来自:
北京
-
EJB持久层cannot simultaneously fetch multiple bags异常的解决
病理特征:Caused by: org.hibernate.HibernateException: cannot simultaneously fetch multiple bags,
堆栈信息:org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'initSystemDataBySpringListeren': Injection of resource fields failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'service': Injection of resource fields failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'assistantDao': Injection of resource fields failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory' defined in class path resource [spring-core-config.xml]: Invocation of init method failed; nested exception is org.hibernate.HibernateException: cannot simultaneously fetch multiple bags
......
cannot simultaneously fetch multiple bags异常是由于持久层实时加载太多异同对象而致。例如用户登录时,同步实时加载用户的角色对象、权限对象,而往往这些关系都是多对多关系,就单一列内容来看存在重复的值,从而引起multiple bags。我在网上搜索这类结果,几乎都提出一个解决办法——采用延迟加载,即fetch=FetchType.LAZY,这样就束缚了框架的强大功能,也有提过用@IndexColumn解决,但@IndexColumn是Hibernate的东西,不是JPA规范(下文有讨论)。既要实时加载,又保证不会出现主题问题,这就是本文所要探讨的。
JPA规范中,一对多或多对多的多方数据抓取过来后必须用容器类存,例如Set、List、Map等,初学者可能没有对这个几个容器认真研究,随便拿一个就用。事实上这几个容器有很大的区别,本文不具体讨论这些容器的区别和功能,但提一个特别要注意的区别——导致本文主题的产生——就是容器内是否允许重复值,那让们简单地了解下这此容器的特性:
Set:
_Set中不允许存放重复元素;
_Set中的元素是无序的。
List:
_List中可以存放重复元素;
_List中的元素是一个有序的集合,可以通过访问List中的元素。
Map:
_Map是以键/值存放数据,因此它有较高的存取性能;
_Map中不允许重复的键,但可以有重复的值
有了这些区别,我们就可以开始寻找主题问题,当持久框架抓取一方的对象时,同时加载多方的对象放进容器中,多方又可能与关联其它对象,Hibernate 实现的JPA,默认最高抓取深度含本身级为四级(它有个属性配置是0-3),若多方(第二级)存在重复值,则第三级中抓取的值就无法映射,按照这个道理,就应该报出无法同时加载多个包之异常。由于国内EJB3.0以后的教材是少而甚少,更没有较完善的JPA手册,所以笔者这样的理解可能会引起质疑,但事实上,笔者是通过这个思路解决了问题:
即@ManyToMany或@OneToMany的Many方此时一定用Set容器来存放,而不能用List集合。
不过Hibernate有些功能超越了JPA规范,它支持真正的List集合,映射集合的方式和以前完全一样,只不过要新增 @IndexColumn注解,该注解允许你指明存放索引值的字段。但实际上是创建唯一性索引,抓取多方的结果也是唯一的,就是上述 Set容器不允许重复元素的道理一样。
出现此异常的读者,先看看自己是不是用了List集合而导致此问题的发生,若是用Set还出现此问题,则去看Set容器内的对象的类中是不是还有类似问题。
为尊重作者权利,本文转至:http://howsun.blog.sohu.com/119020926.html
分享到:
Global site tag (gtag.js) - Google Analytics
相关推荐
通过上述组件和策略,EJB的持久层设计能够满足复杂企业应用的需求,提供健壮、可扩展的解决方案。在JBuilder 2005和JDK 1.4.2环境下,开发者可以创建并测试EJB组件,包括持久层的设计,以实现高效的数据管理。
EJB+JPA数据库持久层开发实践详解.pdf 完整版
在"更多电子资料.docx"文档和"EJB+JPA数据库持久层开发实践详解.pdf"中,可能涵盖了以下内容: 1. EJB和JPA的基础概念和原理介绍。 2. 如何创建和配置EJB组件,包括会话bean、实体bean和消息驱动bean的声明与实现。...
EJB.JPA-数据库持久层开发实践详解,感兴趣的人可以阅读一次
### EJB_JPA数据库持久层开发详解 #### JPA与数据持久化技术 **数据持久化**是指将程序运行时的数据保存到永久存储设备中,以便在下次运行时能够读取和使用这些数据。在Java领域,有多种数据持久化技术,包括序列...
【EJB_JPA数据库持久层开发详解】 Java 持久化API(JPA)是Sun官方推出的一种用于处理Java应用程序中数据持久化的标准规范。它简化了与数据库交互的过程,使得开发者可以更加关注业务逻辑而不是底层的数据操作。在...
本文旨在对比四种常用的Java持久层框架:Hibernate、iBatis(现称MyBatis)、EJB(Entity Bean)以及JDO(Java Data Objects)。通过对它们的学习成本、封装性、移植性、执行效率等多个方面的对比分析,帮助开发者更...
【EJB3持久化】是Enterprise JavaBeans 3.0版本中的一个重要特性,它引入了更轻量级的持久化模型,旨在简化企业级应用程序的数据持久化操作。EJB3.0不再局限于传统的EJB2.1实体Bean,而是采用了POJO(Plain Old Java...
EJB.JPA-数据库持久层开发实践详解.冯曼菲 扫描版带书签
Session Facade模式是EJB设计中非常常见的一种模式,它在客户端和实体EJB之间引入了一层Session EJB。这样做的好处有: - 减少网络负载:Session EJB调用实体EJB的本地接口,减少了远程调用的开销。 - 隔离业务...
3. **数据访问层(Data Access Layer)**:EJB中的Entity Beans或单独的数据访问对象(DAO)在此层负责与数据库的交互,存储和检索银行账户等相关信息。 4. **持久层(Persistence Layer)**:数据库系统,如Oracle...
在EJB 3.0版本中,持久性API的引入极大地简化了对象关系映射(ORM),使得开发者可以更加专注于业务逻辑,而无需过多地关注数据库交互的细节。以下是关于EJB 3.0持久性API的详细知识点: 1. **注解驱动的持久化**:...
【 ejb 持久化基于 J2EE 的分布式数据库】知识详解 J2EE(Java 2 Platform Enterprise Edition)是Sun Microsystems推出的企业级应用开发和部署平台,它旨在为构建可扩展、跨平台、安全且标准兼容的企业级应用程序...