`
ariyue
  • 浏览: 345358 次
  • 性别: Icon_minigender_1
  • 来自: 厦门
社区版块
存档分类
最新评论

当json碰到hibernate 延时加载

阅读更多
在开发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>
分享到:
评论
1 楼 object_object 2011-11-21  
写得很好,学习了,类似这些问题有些时候非常耗时间

相关推荐

    【北大青鸟内部教程】jsp中关于Hibernate延时加载的问题

    6. **JSON序列化**:当将对象序列化为JSON时,如果对象包含延时加载的属性,序列化过程可能会触发不必要的数据库查询。为了避免这种情况,可以使用JSON库的定制配置或在序列化前手动加载关联数据。 在实践中,理解...

    jackson-datatype-hibernate, 用于处理Hibernate的Jackson JSON处理器模块( http,Add.zip

    datatype-hibernate, 用于处理Hibernate的Jackson JSON处理器模块( http,Add 构建 Jackson 模块( jar ) 以支持JSON序列化和反序列化 Hibernate ( http://hibernate.org ) 特定数据类型和属性,特别是延迟加载方面。...

    Dwr+Hibernate的Lazy问题

    然而,在DWR场景下,由于DWR需要将Java对象转换为JSON格式,以便在JavaScript中使用,这会触发getter方法,从而无意中激活了延迟加载,导致每访问一个延迟加载属性,就会执行一条SQL查询。 解决方案: 1. 使用`...

    flexjson-2.1.zip

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

    Hibernate4.1环境搭建

    - `excludeProperties`参数用于指定哪些属性不应该被包含在最终输出的JSON数据中,这对于避免Hibernate的延迟加载问题非常有用。 #### 三、总结 通过上述步骤,我们可以成功地搭建起Spring4.1 + Hibernate4 + ...

    hibernate完整JAR包

    7. **其他依赖**:如dom4j.jar用于XML处理,cglib.jar和asm.jar用于动态代理和字节码操作,这些库在处理代理实体和实现延迟加载时起作用。 8. **类型转换**:hibernate-types-52.jar包含了一些自定义的Hibernate...

    hibernate5.3 jar包

    3. **新特性与改进**:引入了延迟加载(Lazy Loading)的改进,支持了更灵活的关联管理,包括更细粒度的控制加载策略。同时,还增强了对JPQL和HQL查询的处理能力。 4. **Caching增强**:支持了更多缓存提供商,如...

    hibernate小白极简实例

    Hibernate支持懒加载,允许延迟加载关联的对象,以提高性能。`@OneToMany`, `@ManyToOne`, `@OneToOne`等注解可以定义关联关系,`fetch=FetchType.LAZY`启用懒加载。级联操作(`cascade=CascadeType.ALL`)使得对父...

    hibernate最新版本5.2.3所有jar包

    - Hibernate提供了各种性能调优选项,包括批处理、延迟加载、懒加载等策略,以适应不同场景的需求。 综上所述,Hibernate 5.2.3版本包含的jar包是一个完整的ORM解决方案,覆盖了从数据库交互、对象模型、查询语言...

    Json工具类使用.docx

    `JSONUtil` 类就是一个这样的工具类,它提供了将Java对象转换为JSON对象的功能,并且特别地,它还支持Hibernate的延迟加载对象。 在描述中提到的`JSONUtil`类,它的主要功能是通过反射机制将Java对象转换为JSON格式...

    hibernate-extensions-2.1.3

    1. **延迟加载(Lazy Loading)增强**:Hibernate核心库已经支持延迟加载,但扩展可能提供了更精细的控制,例如按需加载关联的对象集合,减少内存占用和提高性能。 2. **批量操作**:批量插入、更新和删除功能可以...

    jsonplugin, 对 struts2.1.X版本jsonplugin-0.34.jar 的修改

    第一次上传,要5分,是物有所值,处理了jsonplugin 的no session的问题,并且添加了,新的注释,例如 ...2.对one-ton-many ,one-to-one ,值设为null(被设置为延迟加载的时候) 3.不需要配置底层实体,在当前action配置就可以

    Struts2整合hibernate所需的jar包

    - 考虑性能优化,如延迟加载、批处理等。 通过以上步骤,我们可以成功地将Struts2和Hibernate整合在一起,实现高效的Web应用开发。记住,理解每个框架的核心功能和它们之间的协作机制是整合的关键。同时,不断学习...

    hibernate-release的5.0.7版本和最新的5.3.6版本

    3. 提供了更强大的Session API,包括对延迟加载的控制,以及更灵活的事务管理。 4. 对HQL和JPQL的解析和执行进行了改进,增强了查询的表达能力。 5. 修复了一些已知的bug,提高了框架的整体稳定性。 而Hibernate ...

    基于spring+springmvc+hibernate的全注解开发

    - **Hibernate的懒加载和即时加载**,`@Lazy`注解用于实现延迟加载,提高性能。 - **Spring的 profiles**,通过`@Profile`注解,可以针对不同的环境(如开发、测试、生产)启用或禁用特定的bean。 总之,基于Spring...

    Hibernate说明文档.rar_ajax_hibernate

    - 尽量使用延迟加载(Lazy Loading)以减少内存占用。 - 对于大数据量的查询,考虑分页或流式结果集。 - 谨慎处理级联操作,防止不必要的数据更新。 总结,Hibernate作为Java ORM框架,简化了数据库操作,提高了...

    hibernate插件资料

    9. **Hibernate JPA 2.1/2.2支持**:随着JPA规范的发展,Hibernate也不断更新以支持新的特性,例如:多租户、存储过程、延迟加载改进等。 10. **Hibernate Types**:这是一个社区维护的项目,提供了额外的Hibernate...

    Hibernate In Action

    7. **性能优化**:讨论了如何通过优化查询、批处理、延迟加载等方式提升Hibernate应用的性能。 8. **高级特性**:涵盖了动态模型、事件监听器、自定义类型、方言支持、XML和JSON的处理,以及与其他技术(如Spring...

    hibernate错误示例一

    理解Hibernate的工作原理,尤其是其对关联管理和延迟加载的策略,对于排查这类问题至关重要。同时,利用IDE的调试器查看对象状态,以及使用日志输出来追踪执行流程也是必不可少的。 总之,理解和处理Hibernate的...

Global site tag (gtag.js) - Google Analytics