Hibernate 延迟加载和openSessionInView及HibernateInterceptor

在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提供的方法即可满足需求!
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值