最近在看hibernate,到一对多查询时,发现一个问题。就是用一般的session.get(Class,id)方法在查询时,是错误的。问题比较初级,到后来一看,是为了性能才这样架构的.
错误的日志是这样的:
2009-08-08 20:18:06 [org.hibernate.LazyInitializationException]-[ERROR] failed to lazily initialize a collection of role: org.zzx.entity.Department.emps, no session or session was closed
org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: org.zzx.entity.Department.emps, no session or session was closed
at org.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationException(AbstractPersistentCollection.java:358)
at org.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationExceptionIfNotConnected(AbstractPersistentCollection.java:350)
at org.hibernate.collection.AbstractPersistentCollection.initialize(AbstractPersistentCollection.java:343)
at org.hibernate.collection.AbstractPersistentCollection.read(AbstractPersistentCollection.java:86)
at org.hibernate.collection.PersistentSet.iterator(PersistentSet.java:163)
at org.apache.struts.taglib.logic.IterateTag.doStartTag(IterateTag.java:267)
at org.apache.jsp.MyJsp_jsp._jspService(MyJsp_jsp.java:309)
at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:374)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:342)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:267)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:630)
at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:436)
at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:374)
at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:302)
at org.apache.struts.action.RequestProcessor.doForward(RequestProcessor.java:1083)
at org.apache.struts.action.RequestProcessor.processForwardConfig(RequestProcessor.java:396)
at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:232)
at org.zzx.requestprocessor.MySpringRequestProcessor.process(MySpringRequestProcessor.java:33)
at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1913)
at org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:449)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286)
at org.apache.coyote.http11.Http11AprProcessor.process(Http11AprProcessor.java:857)
at org.apache.coyote.http11.Http11AprProtocol$Http11ConnectionHandler.process(Http11AprProtocol.java:565)
at org.apache.tomcat.util.net.AprEndpoint$Worker.run(AprEndpoint.java:1509)
at java.lang.Thread.run(Thread.java:619)
解决方法是这样的,在你session的事务提交之前写上Hibernate.initialize(对象.get集合属性()),这样就可以正常运行了。
分享到:
相关推荐
在Hibernate中,懒加载主要体现在一对多、多对一、多对多等关联关系上。当我们在实体类中使用`@OneToMany`、`@ManyToOne`或`@ManyToMany`注解,并设置`fetch = FetchType.LAZY`时,就会启用懒加载。然而,懒加载的...
《Hibernate一对多关系的数据操作详解》 在Java的持久化框架Hibernate中,关系映射是其核心特性之一,尤其是一对多(One-to-Many)关系的处理,它广泛存在于现实世界的业务场景中,如一个用户可以有多个订单,一个...
标题"Hibernate双向一对多"指的是Hibernate框架中的一个重要关系映射概念,即在一个实体类中,一个实例可以与多个另一个实体类的实例相关联,而在另一个实体类中,每个实例也可以关联到该实体类的一个实例。...
例如,在Hibernate中查询一个对象并尝试访问其延迟加载的关联对象时,如果没有正确的Session管理机制,就可能会引发此类异常。 **具体原因包括:** 1. **Session过早关闭:** 如果在事务或请求结束时关闭了Session...
在一对多关联中,你可能会遇到懒加载(lazy loading)和立即加载(eager loading)的问题,以及如何处理级联操作。 在`OneToMany_1`这个文件中,应该包含了具体的源代码示例,包括实体类、映射文件和测试类。通过...
当我们在 Hibernate 中使用懒加载特性时,可能会遇到 LazyInitializationException 异常,这是因为 Hibernate 的 Session 生命周期太短,导致了懒加载失败。 为了解决这个问题,我们可以使用 Spring 提供的一个支持...
在开发Flex与Hibernate集成的应用时,延迟加载(Lazy Loading)是一个常见的挑战,因为Flex客户端无法直接理解和处理Hibernate的延迟加载机制。延迟加载是一种优化策略,它允许关联的对象在真正需要时才被加载,而...
在Hibernate中,一对多、多对一和多对多关系通常可以配置为延时加载。 在JSP中使用Hibernate,开发者可能会遇到以下几种常见的延时加载问题: 1. **空指针异常**:如果没有正确地处理延时加载,当尝试访问未加载的...
在处理一对多关联查询时,我们可能会遇到内连接(JOIN)和左连接(LEFT JOIN)。`JOIN`会返回两个表中存在匹配的所有记录,而`LEFT JOIN`会返回所有左侧表的记录,即使右侧表没有匹配的记录。 在HQL中,我们可以...
在使用Hibernate进行Java对象关系映射(ORM)开发时,经常会遇到一对多和多对一关系的处理。这些关系在数据库中很常见,比如一个部门可以有多名员工,而每个员工则隶属于一个部门。在本篇文章中,我们将深入探讨在...
不过,通常这类博客会详细讲解如何在实际项目中设置和使用双向一对多映射,包括配置XML映射文件或使用注解,以及解决可能遇到的问题,比如懒加载异常、级联操作的使用等。 至于文件`shop_goods_20131001`,由于缺乏...
在Java的持久化框架Hibernate中,多对多(Many-to-Many)关系映射是一种常见的数据库交互模式,它用于表示两个实体之间复杂的关系。在这个场景中,一个实体可以与多个其他实体相关联,反之亦然。例如,在学生和课程...
**标题解析:** "Hibernate 一对多双向映射及乐观锁使用" 在Java开发中,Hibernate作为一款流行的ORM(对象关系映射)框架,能够帮助开发者将数据库操作转化为面向对象的编程,简化了数据访问层的实现。"一对多"是...
作者可能会讨论如何处理关联的懒加载和即时加载,以及可能遇到的问题和解决方案。 ### 实际应用 在实际开发中,一对一关系常用于那些逻辑上紧密耦合但又需要独立存储的数据模型,如用户个人信息和用户账户信息,...
在实际开发中,我们可能还会遇到一些问题,比如懒加载(Lazy Loading)、EAGER加载策略的选择,以及级联操作的合理设置等。这些都需要根据业务需求和性能考虑来调整。 总之,Hibernate的一对一主键关联映射,特别是...
在Java开发中,使用Hibernate作为ORM框架时,我们可能会遇到一个性能上的问题,那就是著名的“N+1查询问题”。此问题源于不恰当的数据加载策略,可能导致数据库查询效率低下,尤其在大数据量的情况下,会严重影响...
总之,使用Hibernate进行一对多单向关联配置时,无论是注解还是XML方式,关键在于正确设置关联的属性和字段,以及理解这些配置如何影响数据库的交互。通过这种方式,我们可以在Java应用中轻松管理复杂的实体关系。
在本篇文章中,我们将深入探讨如何实现双向关联的一对多映射,以及在实际应用中可能会遇到的问题和解决方案。 首先,我们需要了解什么是双向关联。在Hibernate的一对多关联中,双向关联意味着双方都可以通过导航...
懒加载主要通过`@ManyToOne`, `@OneToMany`, `@OneToOne`和`@ManyToMany`这些关联映射注解实现,特别是对于一对多(OneToMany)或多对一(ManyToOne)的关系。当我们定义这些关系时,如果不希望在加载父对象时立即...
在关系型数据库中,我们经常遇到一对多(1:N)的关系,比如一个用户可以有多个订单,一个部门可以有多个员工。在Hibernate中,当试图加载一个"1"端的对象并连带其所有"N"端的对象时,如果没有正确配置或优化,就会...