问题分析:
这里报的是:数据延迟加载异常!
当取关联对象的非主键的其他字段的值,都会延迟加载(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); }
|
相关推荐
错误表现:在Session关闭后尝试访问懒加载属性,抛出“org.hibernate.LazyInitializationException: could not initialize proxy - no Session”异常。 解决方案:理解并合理使用Open Session in View(OSIV)模式...
Java错误大全涵盖了从基础异常到特定开源框架如Hibernate和Struts中可能出现的异常情况。以下是一些关键知识点的详细说明: 1. **错误类型:**Java中的错误通常分为两种主要类型,异常(Exception)和错误(Error)...
- **错误排查**:熟悉常见的Hibernate异常,如LazyInitializationException,及时定位和解决问题。 通过这个快速入门教程,读者可以系统地学习如何在MyEclipse环境中配置和使用Hibernate,实现高效、便捷的Java...
4. **懒加载异常**:在脱离Session时尝试访问延迟加载属性,会出现“LazyInitializationException”。 5. **对象状态异常**:如 detached(分离)状态的对象试图更新,可能导致“DetachedObjectException”。 二、...
- 如果数据库中不存在该对象,则会抛出`org.hibernate.LazyInitializationException`或`org.hibernate.ObjectNotFoundException`异常。 - 使用`load()`可以提高性能,因为它减少了不必要的数据库访问。 2. **Get...
Exception in thread "main" org.hibernate.LazyInitializationException: could not initialize proxy - the owning Session was closed ``` - **日志记录**:为了更好地诊断问题,可以使用log4j等工具进行日志...
13. **Hibernate的LazyInitializationException**:当试图初始化一个代理对象,但其所属的Session已关闭时,会抛出此异常。解决方法是确保在Session关闭前完成懒加载操作,或考虑使用Eager Loading或Open Session In...
2. **初始化时机**:懒加载只能在session打开状态下工作,一旦session关闭,尝试访问懒加载属性将会抛出`LazyInitializationException`异常。因此,需要确保在业务逻辑中合理安排初始化关联数据的时间点。 3. **透明...
然而,当在Session关闭后尝试访问这些延迟加载的属性,就会抛出`org.hibernate.LazyInitializationException`异常,提示“无法懒惰初始化集合角色...,无会话或会话已关闭”。这是因为延迟加载需要有效的Hibernate ...
- Hibernate提供了自己的异常体系,如HibernateException、ObjectRetrievalFailureException等,需要在编程中适当地捕获和处理。 **9. 性能优化** - 避免N+1查询,通过批处理或JOIN查询减少数据库访问次数。 - 合理...
在使用懒加载技术时,可能会遇到“LazyInitializationException”这类异常。该异常通常发生在试图访问延迟加载的关联对象时,而此时Session已经关闭的情况。例如,在Hibernate中查询一个对象并尝试访问其延迟加载的...
然而,这也意味着如果Session在加载懒加载属性之前已经关闭,则会导致`HibernateException`(具体为`org.hibernate.LazyInitializationException`)。因此,正确地管理Session的生命周期对于实现Lazy Loading至关...
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> <bean class="com.mchange.v2.c3p0.ComboPooledDataSource"> <!-- 数据库连接信息 --> ${jdbcUrl}"> ${...
18. **LazyInitializationException或延迟加载异常**:在实体类的懒加载属性上未使用fetch,导致无法加载关联数据。考虑在查询中加入fetch语句。 19. **IdentifierGenerationException**:高位表(如用于生成唯一ID...
当Session关闭后访问延迟加载的对象时,会抛出`LazyInitializationException`异常,可以通过提前调用`Hibernate.initialize()`或在Session关闭前查询所需属性来解决。 2. **集合**:在一对多或集合关联中,可以...
18. **LazyInitializationException**或延迟加载异常:在查询中未启用fetch,导致延迟加载失败。考虑使用`fetch join`或调整懒加载策略。 19. **IdentifierGenerationException**:高位表(如用于生成ID的表)未...
然而,当尝试将这些延迟加载的对象转换为JSON格式时,由于JSON序列化过程通常不理解Hibernate的会话管理,因此可能会引发异常。 Flexjson库为了解决这个问题,提供了一种优雅的方式来处理Hibernate的延迟加载对象。...
然而,如果在`Session`关闭后尝试访问关联对象,会抛出`LazyInitializationException`异常,因为延迟加载策略只在`Session`打开的状态下有效。 **延迟加载的生效期** 延迟加载的生效时间与`Session`的生命周期相同...
- **错误处理**:了解常见的 Hibernate 异常类型及其解决方案,例如 `LazyInitializationException` 等。 - **测试**:编写单元测试和集成测试来验证 Hibernate 功能是否正确实现。 - **代码审查**:定期进行代码...