在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,得知其配置大致如下:
在<props>里面视乎要用到spring-mvc框架做View层,但是我在项目中使用struts2。所以也没有使用这种方法。这里主要想介绍的是第三方法。
第三:使用HibernateInterceptor的配置方法实现。配置文件:
我在com.jay.DataProvider里面主要提供两个接口:String getRolesList()取得所有权限。String getUserByRoleId(Int roleId)取得roleID对应的用户。而在需要使用DataProvider的Action,就要配置文件中注入,如:
那么在com.edward.action.UserRoleAction中只需直接调用dataProvider提供的方法即可满足需求!
实现方法多种,其他的我并不了解,这几天因为遇到了相关问题,总结了三种方法:
第一:在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提供的方法即可满足需求!