`
反求诸己
  • 浏览: 543319 次
  • 性别: Icon_minigender_1
  • 来自: 湖南娄底
社区版块
存档分类
最新评论

异常:org.hibernate.LazyInitializationException

    博客分类:
  • SSH
阅读更多

org.hibernate.LazyInitializationException: could not initialize proxy - no Session
 at org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:57)
 at org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:111)
 at org.hibernate.proxy.pojo.cglib.CGLIBLazyInitializer.invoke(CGLIBLazyInitializer.java:150)
 at com.hibernate.bean.Booktype$$EnhancerByCGLIB$$f34a40bf.getName(<generated>)
 at test.TestBookinfoBizImpl.testFindAllBookinfos(TestBookinfoBizImpl.java:129)
 at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
 at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
 at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
 at java.lang.reflect.Method.invoke(Method.java:597)
 at org.junit.internal.runners.TestMethodRunner.executeMethodBody(TestMethodRunner.java:99)
 at org.junit.internal.runners.TestMethodRunner.runUnprotected(TestMethodRunner.java:81)
 at org.junit.internal.runners.BeforeAndAfterRunner.runProtected(BeforeAndAfterRunner.java:34)
 at org.junit.internal.runners.TestMethodRunner.runMethod(TestMethodRunner.java:75)
 at org.junit.internal.runners.TestMethodRunner.run(TestMethodRunner.java:45)
 at org.junit.internal.runners.TestClassMethodsRunner.invokeTestMethod(TestClassMethodsRunner.java:66)
 at org.junit.internal.runners.TestClassMethodsRunner.run(TestClassMethodsRunner.java:35)
 at org.junit.internal.runners.TestClassRunner$1.runUnprotected(TestClassRunner.java:42)
 at org.junit.internal.runners.BeforeAndAfterRunner.runProtected(BeforeAndAfterRunner.java:34)
 at org.junit.internal.runners.TestClassRunner.run(TestClassRunner.java:52)
 at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:38)
 at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
 at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:460)
 at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:673)
 at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:386)
 at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:196)

问题分析:

这里报的是:数据延迟加载异常!

当取关联对象的非主键的其他字段的值,都会延迟加载(hibernate默认的)!由于当hibernate交给spring进行管理之后,连接对象实际上已经交给spring的一个叫TransactionAsychronizationManager进行管理, 默认的,在执行一个操作后,session将被关闭.这时如果代码访问的数据涉及延迟加载,将抛出延迟加载异常;

 

 

 

解决办法:

 

1。可以在多的一方(假定为A类)设置lazy = “FALSE”,即不延迟加载数据!

但是也有一些问题,就是当我不需要使用到一方(B类)的数据时,hibernate也会帮我把B的数据加载出来,这样一来的话,对程序的性能就有影响!所以我会采用下面这种优雅一点的方法!

 

值得注意的是:下面我所解决的只能是在Jnit的测试类中才可以手动配置连接对象的开启和关闭

2。下面的配置比较复杂,所以把思路整理了一下!但是通过手动编码就可以把后台类(数据访问层)进行一次完整的测试(增删改查--包括延迟加载),

 

 

手动配置如下:

@Before
 public void setUp() throws Exception {
  
  String config = "applicationContext.xml";
   ctx = new ClassPathXmlApplicationContext(config);
  
  bookinfoBiz = (IBookinfoBiz)ctx.getBean("BookinfoBizImpl");
  booktypeBiz = (IBooktypeBiz)ctx.getBean("BooktypeBizImpl");
  
  //获得sessionFactory
     sessionFactory = (SessionFactory)ctx.getBean("sessionFactory");

  //手动编码打开session
  
  Session session = sessionFactory.openSession();
  
  //将session保存在SessionHolder ,并由TransactionSynchronizationManager进行管理
  //保存
  SessionHolder sessionHolder = new SessionHolder(session);
  //管理,绑定到本地线程
  TransactionSynchronizationManager.bindResource(sessionFactory,sessionHolder);
  
 
 }

 @After
 public void tearDown() throws Exception {
       //1.取出session
  
 SessionHolder sessionHolder = (SessionHolder)TransactionSynchronizationManager.getResource(sessionFactory);
 
 Session session = sessionHolder.getSession();
 //清除
 session.flush();
  
 //从本地线程中取消绑定
 TransactionSynchronizationManager.unbindResource(sessionFactory);
 
 //关闭连接
 SessionFactoryUtils.closeSession(session);
 }

 

 

 

 

 

0
0
分享到:
评论

相关推荐

    Hibernate配置常见错误

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

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

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

    MyEclipse_Hibernate_快速入门中文版.rar

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

    hibernate,struts,spring 常见错误信息

    4. **懒加载异常**:在脱离Session时尝试访问延迟加载属性,会出现“LazyInitializationException”。 5. **对象状态异常**:如 detached(分离)状态的对象试图更新,可能导致“DetachedObjectException”。 二、...

    java框架之hibernate

    - 如果数据库中不存在该对象,则会抛出`org.hibernate.LazyInitializationException`或`org.hibernate.ObjectNotFoundException`异常。 - 使用`load()`可以提高性能,因为它减少了不必要的数据库访问。 2. **Get...

    Hibernate延迟加载以及利用Spring

    Exception in thread "main" org.hibernate.LazyInitializationException: could not initialize proxy - the owning Session was closed ``` - **日志记录**:为了更好地诊断问题,可以使用log4j等工具进行日志...

    Java常见异常集-Java,Hibernate,Tomcat异常

    13. **Hibernate的LazyInitializationException**:当试图初始化一个代理对象,但其所属的Session已关闭时,会抛出此异常。解决方法是确保在Session关闭前完成懒加载操作,或考虑使用Eager Loading或Open Session In...

    Hibernate lazy延迟加载

    2. **初始化时机**:懒加载只能在session打开状态下工作,一旦session关闭,尝试访问懒加载属性将会抛出`LazyInitializationException`异常。因此,需要确保在业务逻辑中合理安排初始化关联数据的时间点。 3. **透明...

    hibernate延迟机制分析

    然而,当在Session关闭后尝试访问这些延迟加载的属性,就会抛出`org.hibernate.LazyInitializationException`异常,提示“无法懒惰初始化集合角色...,无会话或会话已关闭”。这是因为延迟加载需要有效的Hibernate ...

    Hibernate面试题专栏 - 最全的Hibernate面试题, Hibernate笔试题, Hibernate问题

    - Hibernate提供了自己的异常体系,如HibernateException、ObjectRetrievalFailureException等,需要在编程中适当地捕获和处理。 **9. 性能优化** - 避免N+1查询,通过批处理或JOIN查询减少数据库访问次数。 - 合理...

    懒加载异常解决.docx

    在使用懒加载技术时,可能会遇到“LazyInitializationException”这类异常。该异常通常发生在试图访问延迟加载的关联对象时,而此时Session已经关闭的情况。例如,在Hibernate中查询一个对象并尝试访问其延迟加载的...

    过滤器对于session周期的控制

    然而,这也意味着如果Session在加载懒加载属性之前已经关闭,则会导致`HibernateException`(具体为`org.hibernate.LazyInitializationException`)。因此,正确地管理Session的生命周期对于实现Lazy Loading至关...

    OA项目SSH整合框架

    class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"&gt; &lt;bean class="com.mchange.v2.c3p0.ComboPooledDataSource"&gt; &lt;!-- 数据库连接信息 --&gt; ${jdbcUrl}"&gt; ${...

    Javaweb常见错误.pdf

    18. **LazyInitializationException或延迟加载异常**:在实体类的懒加载属性上未使用fetch,导致无法加载关联数据。考虑在查询中加入fetch语句。 19. **IdentifierGenerationException**:高位表(如用于生成唯一ID...

    Hibernate延迟加载

    当Session关闭后访问延迟加载的对象时,会抛出`LazyInitializationException`异常,可以通过提前调用`Hibernate.initialize()`或在Session关闭前查询所需属性来解决。 2. **集合**:在一对多或集合关联中,可以...

    java常见错误集锦.pdf

    18. **LazyInitializationException**或延迟加载异常:在查询中未启用fetch,导致延迟加载失败。考虑使用`fetch join`或调整懒加载策略。 19. **IdentifierGenerationException**:高位表(如用于生成ID的表)未...

    flexjson-2.1.zip

    然而,当尝试将这些延迟加载的对象转换为JSON格式时,由于JSON序列化过程通常不理解Hibernate的会话管理,因此可能会引发异常。 Flexjson库为了解决这个问题,提供了一种优雅的方式来处理Hibernate的延迟加载对象。...

    hibernate 延迟加载.docx

    然而,如果在`Session`关闭后尝试访问关联对象,会抛出`LazyInitializationException`异常,因为延迟加载策略只在`Session`打开的状态下有效。 **延迟加载的生效期** 延迟加载的生效时间与`Session`的生命周期相同...

    Hibernate开发手册

    - **错误处理**:了解常见的 Hibernate 异常类型及其解决方案,例如 `LazyInitializationException` 等。 - **测试**:编写单元测试和集成测试来验证 Hibernate 功能是否正确实现。 - **代码审查**:定期进行代码...

Global site tag (gtag.js) - Google Analytics