在SSH框架组合作开发时,往往都会遇到需要延迟加载的情况。如多对多的表结构关系中,或者一对多的关系。如User和Role表通过User_role表进行多对多关联。这样,在实际项目需求上,可能会有:对用户权限管理,通过Role表得到所有可用权限,在利用user_role表得知该权限下有什么用户。
实现方法多种,其他的我并不了解,这几天因为遇到了相关问题,总结了三种方法:
第一:在hibernate的配置文件中设置“lazy=‘true’”,但我在项目中,使用的是在应用上下文进行sessionFactory配置,使用类“org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean”,通过propery name=“annotatedClasses”把所有POJO加进来。没有使用Hibernate的xml配置文件方式进行映射关联。
第二:使用Spring框架给我们提供的OpenSessionInViewFilter或者OpenSessionInViewInterceptor。但是我在项目中,在web.xml配置该filter时,通过“*.action”匹配,没有起作用,我暂时不知道原因所在,必须通过“/*”匹配,这样对系统性能会造成相当大的影响。然而OpenSessionInViewInterceptor。看了javadocs,得知其配置大致如下:
<bean name="openSessionInViewInterceptor"
class="org.springframework.orm.hibernate3.support.OpenSessionInViewInterceptor">
<property name="sessionFactory">
<ref bean="sessionFactory"></ref>
</property>
</bean>
<bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="interceptors">
<list>
<ref bean="openSessionInViewInterceptor"/>
</list>
</property>
<property name="mappings">
<props>
....
</props>
</property>
</bean>
在<props>里面视乎要用到spring-mvc框架做View层,但是我在项目中使用struts2。所以也没有使用这种方法。这里主要想介绍的是第三方法。
第三:使用HibernateInterceptor的配置方法实现。配置文件:
<bean id="hibernateInterceptor" class="org.springframework.orm.hibernate3.HibernateInterceptor">
<property name="sessionFactory">
<ref bean="sessionFactory"/>
</property>
</bean>
<bean id="dataProviderImpl" class="com.jay.DataProviderImpl">
<property name="userRoleManager">
<ref bean="userRoleManager"/>
</property>
</bean>
<bean id="dataProvider" class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="target">
<ref bean="dataProviderImpl"/>
</property>
<property name="proxyInterfaces">
<value>com.jay.DataProvider</value>
</property>
<property name="interceptorNames">
<list>
<value>hibernateInterceptor</value>
</list>
</property>
</bean>
我在com.jay.DataProvider里面主要提供两个接口:String getRolesList()取得所有权限。String getUserByRoleId(Int roleId)取得roleID对应的用户。而在需要使用DataProvider的Action,就要配置文件中注入,如:
<bean id="userRoleBean" class="com.edward.action.UserRoleAction">
<property name="userRoleManager">
<ref bean="userRoleManager"/>
</property>
<property name="dataProvider" ref="dataProvider"></property>
</bean>
那么在com.edward.action.UserRoleAction中只需直接调用dataProvider提供的方法即可满足需求!
分享到:
相关推荐
### Hibernate延迟加载以及利用Spring #### 一、Hibernate延迟加载概念与原理 ...综上所述,通过合理的配置和编码实践,可以在Spring框架下有效地使用Hibernate的延迟加载功能,从而优化应用性能并减少内存消耗。
### Spring + Hibernate OpenSessionInView 模式的理解和应用 在Java Web开发中,Spring与Hibernate作为两个重要的框架,经常被一起使用来实现业务逻辑与数据持久化的处理。而在使用这两个框架时,为了更好地管理...
为了练手培训,给大家准备的 Open...3.通过 open session in view filter 支持 延迟加载 4.在页面上通过 jstl 很优雅的获取数据 5.通过 spring aop(aspectJ) 声明事务 6.通过formular 映射参数表,指定两个死的变量
5. **延迟加载和OpenSessionInView**: - **延迟加载(Lazy Loading)**:默认情况下,关联的对象只在需要时才加载,以减少不必要的数据库交互,提高性能。 - **OpenSessionInView**:是一种设计模式,用于Web应用...
7. **Hibernate的延迟加载和openSessionInView**: 延迟加载意味着只有在需要时才加载数据,需要在Session范围内。`openSessionInView`过滤器确保每个HTTP请求都有一个开启的Session,以支持延迟加载。 8. **...
`lazy`属性是Hibernate框架中一个非常重要的特性,它通过延迟加载关联对象来优化数据加载过程,从而提升应用性能和资源利用率。然而,正确理解和合理使用`lazy`属性对于避免潜在的异常和性能瓶颈至关重要。通过本篇...
Hibernate的延迟加载与OpenSessionInView - **延迟加载**:在session范围内,仅在实际需要时加载关联对象的数据,提高性能。 - **OpenSessionInView**:在Web层通过Filter保持session的打开状态,直到请求结束,...
OpenSessionInView模式确保在整个HTTP请求生命周期内,数据库操作都在一个开放的Hibernate Session中进行,从而避免了延迟加载时的数据丢失问题。 标题"OpenSessionInView项目整合jar包"指的是包含实现...
Hibernate 的延迟加载与 openSessionInView - **延迟加载**:只在真正需要时才加载关联对象,以提高性能。 - **openSessionInView**:通过在 web 层设置一个 filter 来保持 session 打开状态,从而支持整个请求...
5. 延迟加载(Lazy Loading)和`openSessionInView`模式: - 延迟加载是在需要时才加载关联对象,确保只在session范围内加载,以提高性能。 - `openSessionInView`模式是在Web层使用Filter打开和关闭Session,确保...
Hibernate通过以下方式实现延迟加载: - **使用懒加载代理**:对于一对多或多对多的关系,Hibernate会在需要的时候动态创建代理对象。 - **OpenSessionInView模式**:这是一种解决懒加载异常的有效方案,通过确保...
对于对象关联实例,Hibernate默认使用延迟加载,而对于对象关联集合,可以通过fetch属性设置为"join"或"select"来决定加载方式。延迟加载可以减少不必要的数据传输,但需要注意在Session关闭前使用延迟加载的对象,...
**问题:** 谈谈Hibernate的延迟加载和OpenSessionInView。 - **延迟加载**: 只在真正需要时才加载关联对象。这有助于提高性能,减少不必要的数据加载。 - **OpenSessionInView**: 通过Web层的Filter在一次请求周期...
Hibernate 的延迟加载和 openSessionInView 模式 - **延迟加载**:只在真正需要时才加载关联对象,从而提高应用程序性能。 - **openSessionInView**:通过在 Web 层添加一个 Filter 来维持 Session 的打开状态,...
同时,需要注意的是,OpenSessionInView模式虽然方便,但也会带来潜在的问题,如事务边界不清晰和会话泄漏。因此,在实际应用中,应结合具体需求谨慎使用,并考虑使用更现代的解决方案,如Spring Data JPA的...
SSH框架结合了Struts的MVC设计模式、Spring的依赖注入和事务管理以及Hibernate的持久化能力,为Java Web开发提供了强大的支持。然而,随着Spring Boot的兴起,SSH框架的使用逐渐减少,更多地转向了Spring Boot的开箱...
7. **延迟加载与OpenSessionInView**:延迟加载(Lazy Loading)意味着关联对象在需要时才加载,而OpenSessionInView过滤器确保在HTTP请求生命周期内保持Session打开,以支持延迟加载。 8. **Spring事务管理**:...
懒加载是指Hibernate在访问对象时,可以延迟加载关联对象,直到真正访问到关联对象时才执行数据库查询。缓存分为一级缓存和二级缓存,一级缓存Session级共享,而二级缓存是SessionFactory级共享。配置Hibernate缓存...
6. Hibernate的`load()`和`get()`方法的区别在于,`load()`假设数据一定存在于数据库中并返回代理对象,延迟加载直到实际使用属性时才查询数据库,如果数据不存在则抛出`ObjectNotFoundException`。而`get()`会首先...
7. **Hibernate的延迟加载和OpenSessionInView** - **延迟加载**:在需要数据时才查询数据库,需在同一个Session作用域内。 - **OpenSessionInView**:通过过滤器保持Session在整个HTTP请求期间开启,确保延迟加载...