`
sumongh
  • 浏览: 226515 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

OpenSessionInView模式

阅读更多
 

OpenSessionInView模式

Spring+Hibernate中,  集合映射如果使用lazy="true", 当PO传到View层时, 出现未初始化session已关闭的错误,只能在dao先初始化
parent.getChilds().size();

Spring提供Open Session In View来解决这个问题, 有两种方式
1. Interceptor
<bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
    
<property name="interceptors">
        
<list>
            
<ref bean="openSessionInViewInterceptor"/>
        
</list>
    
</property>
    
<property name="mappings">
    .
    
</property>
</bean>

<bean id="openSessionInViewInterceptor"
class
="org.springframework.orm.hibernate.support.OpenSessionInViewInterceptor">
    
<property name="sessionFactory">
        
<ref bean="sessionFactory"/>
    
</property>
</bean>
2. Filter
<web-app>
 
<filter>
<filter-name>hibernateFilter</filter-name>
<filter-class>
org.springframework.orm.hibernate.support.OpenSessionInViewFilter
</filter-class>
</filter>
 
<filter-mapping>
<filter-name>hibernateFilter</filter-name>
<url-pattern>*.do</url-pattern>
</filter-mapping>

</web-app>

说明: 个人更喜欢用Interceptor方式, filter是在web.xml中定义
有了OpenSessionInView,并不是一切就ok了。简单的crud可以,但对于复杂业务逻辑就要想点法子。

OSIV默认是request per session的, 所以即使没有显式update(po),Hibernate也会帮你保存的,dao的业务判断就无效,还好有evict()可用。
update code
Controller
public ModelAndView update() {
    p 
= dao.getVo(id);
    bindObject(request);
    dao.update(p);
}


Dao
public Object getVo(id) {
    p 
= getHibernateTemplate().get(clazz, id);
    p.getChilds().size();
    getHibernateTemplate().evict(p);
    
return p;
}

public void update(p) {
    oldP 
= getVo(id);
    
// ++--(oldP);
    getHibernateTemplate().update(p);
    
// ++--(p);
}



分享到:
评论

相关推荐

    Spring hibernate opensessioninview

    - `singleSession`:如果设置为`true`,则表明启用OpenSessionInView模式,即在请求处理期间始终维持一个打开的Session。如果设置为`false`,则不启用此模式。 - `&lt;url-pattern&gt;`:定义哪些URL路径将通过此过滤器...

    OpenSessionInView项目整合jar包

    标题"OpenSessionInView项目整合jar包"指的是包含实现OpenSessionInView模式所需的各种库文件的压缩包。这些jar包是完成项目整合的关键组成部分,它们可能包括以下内容: 1. **Spring框架**: Spring的核心库(如...

    第30讲--Spring提供的CharacterEncoding和OpenSessionInView功能

    同时,需要注意的是,OpenSessionInView模式虽然方便,但也会带来潜在的问题,如事务边界不清晰和会话泄漏。因此,在实际应用中,应结合具体需求谨慎使用,并考虑使用更现代的解决方案,如Spring Data JPA的...

    SSH整合示例项目 hibernate5.2.3+struts2.5.2+spring4.3.3.zip

    - **二级缓存**:提高数据访问效率,OpenSessionInView模式下配合Spring实现 session级缓存。 **OpenSessionInView模式** OpenSessionInView模式是一种解决数据持久层和Web层之间事务管理的策略。在用户请求到达时...

    SSH整合 struts+hibernate+spring

    **OpenSessionInView模式**是一种常用的Hibernate优化模式,其主要目的是解决Hibernate的一级缓存问题。通过这种方式,可以确保在一个HTTP请求的生命周期内,Hibernate的Session始终处于打开状态,从而避免了因...

    百度面试题

    - OpenSessionInView模式在Web请求处理过程中保持Hibernate Session打开,直到视图渲染完成,确保数据的一致性。但也可能导致长时间持有数据库连接,增加内存占用。合理控制Session的生命周期对性能至关重要。 10....

    搭建SSH框架总结.doc

    7. **配置OpenSessionInView模式**:在`web.xml`中配置`OpenSessionInViewFilter`,目的是解决在HTTP请求结束后才提交事务导致的懒加载问题。通过在视图渲染阶段保持数据库会话,可以确保所有延迟加载的数据都能正确...

    Hibernate分页总结

    在使用Spring框架时,推荐采用OpenSessionInView模式,确保请求处理的整个过程中数据库会话保持打开。这样可以避免因事务过早关闭导致的懒加载问题,但需要注意不要在视图层进行大数据量的分页查询,以免内存溢出。 ...

    hibernate 中的lazy属性祥解.txt

    为了避免这种情况,可以在访问关联对象前检查Session是否仍然打开,或者使用OpenSessionInView模式来管理Session的生命周期。 ### 结论 `lazy`属性是Hibernate框架中一个非常重要的特性,它通过延迟加载关联对象来...

    TSH练习例子

    FreeRoller和Atlassian Confluence等应用采用OpenSessionInView模式,尽管存在争议,但在某些场景下能有效提升效率。 ### Domain Logic与Use Case Logic 文档提到区分Domain Logic(领域逻辑)和Use Case Logic...

    SSH面试总结(非常全)

    Hibernate的缓存策略与openSessionInView模式** 缓存策略是Hibernate性能优化的关键,而`openSessionInView`模式则是在Web应用中实现一级缓存的有效手段。它通过在每个请求开始时打开一个`Session`,并在请求结束...

    java程序员ssh面试常见题

    - **知识点概述**:Lazy Loading是一种延迟加载策略,而OpenSessionInView模式则是在整个请求周期内保持Session打开的状态。 - **详细解释**: - **Lazy Loading**:当实体加载时,并不立即加载其关联的集合或属性...

    百度面试题汇总(java)

    9. **OpenSessionInView模式下的Transaction、数据库连接、HibernateSession管理**:该模式用于将一个持久化上下文的生命周期与HTTP请求绑定起来,简化事务管理。 10. **Error、CheckedException和Unchecked...

    spring面试大全

    对于OpenSessionInView模式的问题,Spring 提供了OpenSessionInViewFilter或OpenSessionInViewInterceptor来解决。 7. **事务管理**:Spring 提供了两种事务管理方式:编程式和声明式。编程式事务管理使用...

    struts-2.3.24.1+spring4.2.1+hibernate5.0

    6. **整合 Spring 和 Hibernate**:配置数据源,创建 SessionFactory,通过 Spring 的 HibernateTemplate 或者 SessionFactory 的 OpenSessionInView 模式进行数据访问。 7. **测试与调试**:确保所有组件能够正常...

    jsf + spring +hibernate 自己做的一个例子,主要是看一些基本配置

    在整合JSF、Spring和Hibernate时,通常会使用Spring的OpenSessionInView模式来处理数据库会话。这能确保在HTTP请求的整个生命周期内保持有效的Hibernate Session,从而避免可能出现的数据访问问题。 至于压缩包中的...

    hibernate优化

    在Web开发中,OpenSessionInView模式能有效解决这个问题,但也要注意避免长时间占用Session资源。 其次,【抓取粒度】的调整也是关键。粒度决定了导航关联关系时预加载的数据量。通过设置batch-size,可以控制一次...

    spring面试题大全.doc

    对于OpenSessionInView模式,可以通过`OpenSessionInViewFilter`或`OpenSessionInViewInterceptor`来处理事务和会话范围的问题。 5. **Spring事务管理**: - **TransactionDefinition**:定义事务的属性,如隔离...

    SSH分页技术详解与实例

    2. **预加载**:使用OpenSessionInView模式,避免因多次打开和关闭Session导致的性能损失。 3. **懒加载**:对于关联对象,可采用懒加载策略,减少数据加载量。 4. **动态SQL**:使用MyBatis或JPA等框架,可以方便...

Global site tag (gtag.js) - Google Analytics