在开发Struts2.0+hibernate3.2+spring2.5项目过程中,遇到了failed to lazily initialize a collection of role: XXXXXX, no session or session was closed 这个异常的麻烦,起初到网上找资料,得到了下面的一些解决方法:
1、是把对应一对多的那两个列lazy=true改为lazy=false即可;
2、对于查询中如果用的是xxx.load(class,id)则改为xxx,get(class,id);
3、在web.xml文件中加入:
<filter>
<filter-name>hibernateFilter</filter-name>
<filter-class>
org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
<init-param>
<param-name>singleSession</param-name>
<param-value>false</param-value>
</init-param>
<!--这个-- <init-param>一定要加不然很可能会报错: org.springframework.dao.InvalidDataAccessApiUsageException:Write operations are not allowed in read-only mode (FlushMode.NEVER) - turn your Session into FlushMode.AUTO or remove 'readOnly' marker from transaction definition
-->
</filter>
<filter-mapping>
<filter-name>hibernateFilter</filter-name>
<url-pattern>*.mmg</url-pattern>
</filter-mapping>
对以上方法进行一一测试,到后来结果都是一样,出现同样的异常,后来有苦苦在网上找资料,并自己努力思考,后来也了解到spring能很好地解决这个问题,Spring框架为Hibernate延迟加载与DAO模式的整合提供了一种方便的解决方法。对那些不熟悉Spring与Hibernate集成使用的人,我不会在这里讨论过多的细节,但是我建议你去了解Hibernate与Spring集成的数据访问。以一个Web应用为例,Spring提供了OpenSessionInViewFilter和OpenSessionInViewInterceptor。我们可以随意选择一个类来实现相同的功能。两种方法唯一的不同就在于interceptor在Spring容器中运行并被配置在web应用的上下文中,而Filter在Spring之前运行并被配置在web.xml中。不管用哪个,他们都在请求将当前会话与当前(数据库)线程绑定时打开Hibernate会话。一旦已绑定到线程,这个打开了的Hibernate会话可以在DAO实现类中透明地使用。这个会话会为延迟加载数据库中值对象的视图保持打开状态。一旦这个逻辑视图完成了,Hibernate会话会在Filter的doFilter方法或者Interceptor的postHandle方法中被关闭。用spring解决这个问题而且不用把lazy设置为false,提高性能。
方法是:在web.xml中加入以下配置:
<filter>
<filter-name>hibernateFilter</filter-name>
<filter-class>
org.springframework.orm.hibernate3.support.OpenSessionInViewFilter
</filter-class>
</filter>
<filter-mapping>
<filter-name>hibernateFilter</filter-name>
<url-pattern>*.action</url-pattern>
</filter-mapping>
开始时,把这个配置随意地加到web.xml的最后,发现还是不行,后来又通过网络了解到是过滤器顺序的问题,应该是:
OpenSessionInViewFilter
ActionContextCleanUp
FilterDispatcher
的顺序,最后调整过滤器的顺序,一些问题解决。
注意:有些时候会出现一些页面或者一些其他的action过滤不到,可以修改如下:
<url-pattern>/*</url-pattern>
分享到:
相关推荐
6. **JSON序列化**:当将对象序列化为JSON时,如果对象包含延时加载的属性,序列化过程可能会触发不必要的数据库查询。为了避免这种情况,可以使用JSON库的定制配置或在序列化前手动加载关联数据。 在实践中,理解...
datatype-hibernate, 用于处理Hibernate的Jackson JSON处理器模块( http,Add 构建 Jackson 模块( jar ) 以支持JSON序列化和反序列化 Hibernate ( http://hibernate.org ) 特定数据类型和属性,特别是延迟加载方面。...
然而,在DWR场景下,由于DWR需要将Java对象转换为JSON格式,以便在JavaScript中使用,这会触发getter方法,从而无意中激活了延迟加载,导致每访问一个延迟加载属性,就会执行一条SQL查询。 解决方案: 1. 使用`...
然而,当尝试将这些延迟加载的对象转换为JSON格式时,由于JSON序列化过程通常不理解Hibernate的会话管理,因此可能会引发异常。 Flexjson库为了解决这个问题,提供了一种优雅的方式来处理Hibernate的延迟加载对象。...
- `excludeProperties`参数用于指定哪些属性不应该被包含在最终输出的JSON数据中,这对于避免Hibernate的延迟加载问题非常有用。 #### 三、总结 通过上述步骤,我们可以成功地搭建起Spring4.1 + Hibernate4 + ...
7. **其他依赖**:如dom4j.jar用于XML处理,cglib.jar和asm.jar用于动态代理和字节码操作,这些库在处理代理实体和实现延迟加载时起作用。 8. **类型转换**:hibernate-types-52.jar包含了一些自定义的Hibernate...
3. **新特性与改进**:引入了延迟加载(Lazy Loading)的改进,支持了更灵活的关联管理,包括更细粒度的控制加载策略。同时,还增强了对JPQL和HQL查询的处理能力。 4. **Caching增强**:支持了更多缓存提供商,如...
Hibernate支持懒加载,允许延迟加载关联的对象,以提高性能。`@OneToMany`, `@ManyToOne`, `@OneToOne`等注解可以定义关联关系,`fetch=FetchType.LAZY`启用懒加载。级联操作(`cascade=CascadeType.ALL`)使得对父...
- Hibernate提供了各种性能调优选项,包括批处理、延迟加载、懒加载等策略,以适应不同场景的需求。 综上所述,Hibernate 5.2.3版本包含的jar包是一个完整的ORM解决方案,覆盖了从数据库交互、对象模型、查询语言...
`JSONUtil` 类就是一个这样的工具类,它提供了将Java对象转换为JSON对象的功能,并且特别地,它还支持Hibernate的延迟加载对象。 在描述中提到的`JSONUtil`类,它的主要功能是通过反射机制将Java对象转换为JSON格式...
1. **延迟加载(Lazy Loading)增强**:Hibernate核心库已经支持延迟加载,但扩展可能提供了更精细的控制,例如按需加载关联的对象集合,减少内存占用和提高性能。 2. **批量操作**:批量插入、更新和删除功能可以...
第一次上传,要5分,是物有所值,处理了jsonplugin 的no session的问题,并且添加了,新的注释,例如 ...2.对one-ton-many ,one-to-one ,值设为null(被设置为延迟加载的时候) 3.不需要配置底层实体,在当前action配置就可以
- 考虑性能优化,如延迟加载、批处理等。 通过以上步骤,我们可以成功地将Struts2和Hibernate整合在一起,实现高效的Web应用开发。记住,理解每个框架的核心功能和它们之间的协作机制是整合的关键。同时,不断学习...
3. 提供了更强大的Session API,包括对延迟加载的控制,以及更灵活的事务管理。 4. 对HQL和JPQL的解析和执行进行了改进,增强了查询的表达能力。 5. 修复了一些已知的bug,提高了框架的整体稳定性。 而Hibernate ...
- **Hibernate的懒加载和即时加载**,`@Lazy`注解用于实现延迟加载,提高性能。 - **Spring的 profiles**,通过`@Profile`注解,可以针对不同的环境(如开发、测试、生产)启用或禁用特定的bean。 总之,基于Spring...
- 尽量使用延迟加载(Lazy Loading)以减少内存占用。 - 对于大数据量的查询,考虑分页或流式结果集。 - 谨慎处理级联操作,防止不必要的数据更新。 总结,Hibernate作为Java ORM框架,简化了数据库操作,提高了...
9. **Hibernate JPA 2.1/2.2支持**:随着JPA规范的发展,Hibernate也不断更新以支持新的特性,例如:多租户、存储过程、延迟加载改进等。 10. **Hibernate Types**:这是一个社区维护的项目,提供了额外的Hibernate...
7. **性能优化**:讨论了如何通过优化查询、批处理、延迟加载等方式提升Hibernate应用的性能。 8. **高级特性**:涵盖了动态模型、事件监听器、自定义类型、方言支持、XML和JSON的处理,以及与其他技术(如Spring...
理解Hibernate的工作原理,尤其是其对关联管理和延迟加载的策略,对于排查这类问题至关重要。同时,利用IDE的调试器查看对象状态,以及使用日志输出来追踪执行流程也是必不可少的。 总之,理解和处理Hibernate的...