`
CL315917525
  • 浏览: 232120 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

详细解释错误org.hibernate.LazyInitializationException

阅读更多

        转与http://hi.baidu.com/pursuit_on/blog/item/77ceb5586fe61ad29d820418.html

 

错误org.hibernate.LazyInitializationException

org.hibernate.LazyInitializationException: could not initialize proxy - no Session
原因:hibernate3 many-to-one的默认选项是 lazy = "proxy"
解决方法:<many-to-one> & <set> 中设置 lazy="false"

HIBERNATE的持久化对象加载策略。
延迟加载, 也就是用到的时候才去加载.这样可以提高一些性能.
Hibernate的lazy loading 采用了一个HibernateSession来管理session,它的逻辑是每进行一次数据库操作,就开新的session,操作完成后立即关闭该session。这样做的好处是可以严格关闭session,避免菜鸟级的错误,但是hibernate.org并不推荐这么做。因为这不适合lazy loading,也不适合跨方法的事务。

比如在我们的应用中,user->post形成一对多的映射,User中有一个包含post的List。
在User中,有多个属性:name,password,phone等,还有一个List类型的posts。当我们对posts使用lazy laoding的时候,hibernate会在获得User对象的时候,仅仅返回name,password,phone等基本属性,当你访问posts的时候,它才会从数据库中提取posts需要的数据,这就是所谓lazy laoding。但是在我们的系统中,session是被立即关闭的,也就是在读取了name,password,phone等基本属性后,session已经close了,再进行lazy loaiding就会有异常。
解决办法是在close session之前,调用Hibernate.initialize(user.getPosts()),告诉系统,user.getPosts()是需要lazy laoding的。但是这样做会破坏HibernateSession类的封装.
后来采用所谓的OpenSessionInView模式,把session的周期交给servlet filter来管理,每当有request进来,就打开一个session,response结束之后再关闭它,这样可以让session存在于整个请求周期中。


Hibernate中Lazy延迟加载
Hibernate有关one-to-one和many-to-one在查询中的父亲端lazy问题
Hibernate3 在关联上有lazy这个属性,如果是Hibernate2,应该是设置outer-join="false",然后被关联的对象,在class那个地方设置lazy="true".首先,对于many-to-one的问题,可以在父亲端的class标签中设置lazy来解决,这样,在查询儿子的时候,不会发送多余的sql .
对于one-to-one,在hibernate2里面,由于one-to-one里面没有lazy的选项,所以只能通过设置outer-join="false"来解决。而hibernate3已经加入了lazy,所以不会有这个问题。
总体来说,如果你发现你查询儿子的时候,有多余的sql发送,那一定是你对hibernate的误用..

hibernate 的one-to-many,many-to-one,many-to-many中,为了效率的提高,我们一般都采用lazy机制,但使用spring的 getHibernateTemplate().save(Object)时,HibernateTemplate试图每次在execute之前去获得 Session,执行完就力争关闭Session 。也就是说Hibernate的Lazy初始化1:n关系时,你必须保证是在同一个Session内部使用这个关系集合,不然Hiernate将抛出 Failed to lazily initialize a collection - no session or session was closed的例外。


Hibernate 中的对象的关联(association)的设置还是不够灵活,实际应用中有的地方需要lazy load,有的地方又不需要,其实还有的地方就根本不需要使用association。而在Hibernate中,只能在影射文件中设置一种方式,像我们这样的应用,我是不敢轻易使用open session in view的(慢点总比lock住要好),只能是要么不设置association,要么就是lazy=true的。以前的分类信息只用了一个many to one的关系,代价还可以忍受,但现在关系越来越复杂了,再多加几个的话,所要付出的performance,带宽等方面的代价恐怕就不能忽略了,即使使用cache提高一点performance,对带宽的浪费也还是不可原谅的。

 

 

分享到:
评论
3 楼 ql0722 2012-09-28  
  学习了
2 楼 liu414226580 2012-04-23  
liu414226580 写道
    

1 楼 liu414226580 2012-04-23  
    

相关推荐

    集成spring的hibernate懒加载

    当你尝试在Controller层或者视图层访问懒加载的属性时,如果Session已经关闭("no Session..."错误),就会抛出`org.hibernate.LazyInitializationException`。这是因为懒加载的代理对象需要Session来执行数据库查询...

    Hibernate配置常见错误

    错误表现:在Session关闭后尝试访问懒加载属性,抛出“org.hibernate.LazyInitializationException: could not initialize proxy - no Session”异常。 解决方案:理解并合理使用Open Session in View(OSIV)模式...

    hibernate,struts,spring 常见错误信息

    一、Hibernate错误 Hibernate是Java持久层框架,它简化了数据库操作。常见的错误包括: 1. **配置错误**:如XML配置文件中的实体映射错误、数据源配置错误等,可能导致SessionFactory无法创建。 2. **SQL异常**:...

    JAVA常见错误大全.pdf

    3. MappingNotFoundException:在使用Hibernate等ORM框架时,这个错误表明Hibernate无法在指定的位置找到配置文件,如 "hibernate.cfg.xml"。可能的原因是该文件没有放置在项目的根目录或者配置文件有误。 4. ...

    基于SSH框架的BBS论坛JavaEE项目源码

    7.注册如果发送邮件激活的方式出错(返回页面错误org.hibernate.LazyInitializationException: could not initialize proxy - no Session) 8.禁止用户后不允许登录、发帖、回帖等 9.后台会员搜索中文名搜索乱码 ...

    java常见错误集锦.pdf

    Java编程过程中,开发者经常会遇到各种错误,这些错误可能源于语法错误、运行时问题、资源管理不当或是环境配置错误等。以下是一些常见的Java错误及其可能的原因和解决方法: 1. **非法表达式开始**:这通常是由于...

    SSH错误集中分析.

    总的来说,SSH框架错误的排查需要对Spring、Struts2和Hibernate各自的工作原理有深入理解,同时熟悉XML配置和日志信息。遇到问题时,应首先定位错误来源,然后根据错误类型和框架特性去解决问题。通过阅读文档、查阅...

    hibernate错误示例一

    描述中提到的博客链接提供了更多细节,虽然在这里没有直接给出具体内容,但通常博主会详细描述他们在实现OneToOne关系时遇到的问题,包括错误消息、代码片段以及他们的解决思路。访问该链接可以获取更深入的背景信息...

    Hibernate延时加载与lazy机制.doc

    以下是对这些概念的详细解释: **1. Hibernate 延迟加载(Lazy Loading)** 延迟加载是指Hibernate在初始加载实体时并不立即获取所有关联的数据,而是等到实际需要这些数据时才执行相应的SQL查询。这有助于避免一次...

    Javaweb常见错误.pdf

    以下是对这些常见错误的详细解释和解决策略: 1. **标识符错误**:不在函数内使用的标识符是非法的。确保所有变量、方法和类的命名符合Java命名规则,并在正确的作用域内使用。 2. **非法表达式开始**:可能是因为...

    编程语言Javaweb常见错误.pdf

    根据提供的文件信息,以下是对“编程语言Javaweb常见错误.pdf”文档内容的详细知识点梳理: 1. ClassNotFoundException:这是一种在Java Web应用程序开发中常见的运行时错误。它通常发生在Java虚拟机(JVM)尝试...

    MyEclipse_Hibernate_快速入门中文版.rar

    - **错误排查**:熟悉常见的Hibernate异常,如LazyInitializationException,及时定位和解决问题。 通过这个快速入门教程,读者可以系统地学习如何在MyEclipse环境中配置和使用Hibernate,实现高效、便捷的Java...

    使用Spring引起的错误

    通过保持Hibernate Session在整个请求周期内处于打开状态,可以避免在视图层因为Session关闭而导致的`LazyInitializationException`异常。Open Session In View可以通过两种方式进行配置: 1. **...

    hibernate的延迟检索在轻量级J2EE框架中的应用

    - **错误处理**:需要注意的是,延迟加载可能会导致懒加载异常(LazyInitializationException),当Session关闭后尝试访问未初始化的代理对象时会发生这种情况。因此,在实际开发中要注意正确处理这种情况,避免出现...

    java常见错误大全

    错误可能是由于 hibernate.cfg.xml 文件不存在于根目录中,或者文件配置错误。 解决方案:检查 hibernate.cfg.xml 文件是否存在于根目录中,确保文件配置正确无误。 14. ConstraintViolationException 错误可能是...

    ava常见错误以及可能原因集锦

    下面是对一些常见Java错误及其可能原因的详细解释: 1. **非法表达式开始**:这通常是由于语法错误,例如丢失括号导致的。确保所有的开启括号都有对应的关闭括号。 2. **no data found**:当执行SQL查询时没有找到...

    Hibernate电子版及源码

    6. 错误调试:学会识别并解决常见的Hibernate错误,如 LazyInitializationException、StaleObjectStateException 等。 总之,《Hibernate电子版及源码》资源是Java开发者的宝贵学习资料,通过深入学习和实践,...

    java错误大全(包括基本异常和开源框架出现的异常)

    Java错误大全涵盖了从基础异常到特定开源框架如Hibernate和Struts中可能出现的异常情况。以下是一些关键知识点的详细说明: 1. **错误类型:**Java中的错误通常分为两种主要类型,异常(Exception)和错误(Error)...

Global site tag (gtag.js) - Google Analytics