spring+hibernate的延迟加载问题

hzl37du3 2009-09-03 09:57:07
我的配置文件是这样的:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">

<beans>
<bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean">
<property name="configLocation">
<value>classpath:com/danlong/common/config/ehcache.xml</value>
</property>
</bean>

<bean id="methodCache" class="org.springframework.cache.ehcache.EhCacheFactoryBean">
<property name="cacheManager">
<ref local="cacheManager"/>
</property>
<property name="cacheName">
<value>person.danlong.METHOD_CACHE</value>
</property>
</bean>

<bean id="methodCacheInterceptor" class="com.danlong.common.interceptor.MethodCacheInterceptor">
<property name="cache">
<ref local="methodCache" />
</property>
</bean>

<bean id="methodCachePointCut" abstract="true" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">
<property name="advice">
<ref local="methodCacheInterceptor"/>
</property>
<!-- property name="pattern">
<value>.*findMenuRepository</value>
</property-->
</bean>

<!-- JNDI DataSource for J2EE environments -->
<bean id="jndiDataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName"><value>java:comp/env/jdbc/oracle</value></property>
</bean>
<bean id="dataSource" class="com.danlong.common.database.DelegatedDataSource">
<property name="dataSource">
<ref local="jndiDataSource"/>
</property>
</bean>

<bean name="initialEnvironment" class="com.danlong.common.support.InitialEnvironment" parent="/myarea/userManager">
<property name="production"><value>false</value></property>
</bean>

<!-- Hibernate SessionFactory -->
<bean id="sessionFactory" class="com.danlong.common.support.HibernateHelpSessionFactoryBean"
depends-on="hibernateMappingFileSetUtil">
<property name="dataSource"><ref bean="dataSource"/></property>

<property name="mappingResources">
<bean class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
<property name="targetObject"><ref local="hibernateMappingFileSetUtil"/></property>
<property name="targetMethod"><value>getLists</value></property>
</bean>
<!--<list>
<value>com/danlong/common/vo/TbOrderStatus.hbm.xml</value>
</list> -->
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</prop>
<!-- prop key="hibernate.transaction.factory_class">org.springframework.orm.hibernate.LocalTransactionManagerLookup</prop-->
<!-- prop key="hibernate.connection.provider_class">com.strongit.finance.common.database.DatasourceConnectionProvider</prop-->
<prop key="hibernate.query.substitutions">true 1,false 0</prop>
<prop key="hibernate.session_factory_name">hibernate.sessionFactory</prop>
<prop key="hibernate.dialect">org.hibernate.dialect.OracleDialect</prop>
<prop key="hibernate.jdbc.use_streams_for_binary">true</prop>
<prop key="hibernate.jdbc.fetch_size">50</prop>
<prop key="hibernate.jdbc.batch_size">25</prop>
<prop key="hibernate.max_fetch_depth">2</prop>
<prop key="hibernate.show_sql">true</prop>
<!--prop key="hibernate.hbm2ddl.auto">update</prop-->
</props>
</property>
<!-- property name="jtaTransactionManager">
<bean class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
<property name="targetObject"><ref local="transactionManager"/></property>
<property name="targetMethod"><value>getTransactionManager</value></property>
</bean>
</property-->
<property name="jndiName">
<value>jdbc/oracle</value>
</property>
</bean>

<!-- Transaction manager for a single Hibernate SessionFactory (alternative to JTA) -->
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory"><ref local="sessionFactory"/></property>
</bean>

<bean id="txProxyTemplate" abstract="true"
class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="optimize">
<value>true</value>
</property>
<property name="proxyTargetClass"><value>true</value></property>
<property name="interceptorNames">
<list>
<value>daoMethodCacheInterceptor</value>
<value>TransactionInterceptor</value>
</list>
</property>
</bean>

<bean id="TransactionInterceptor" class="org.springframework.transaction.interceptor.TransactionInterceptor">
<property name="transactionManager"><ref bean="transactionManager"/></property>
<property name="transactionAttributes">
<props>
<prop key="get*">PROPAGATION_REQUIRED,readOnly</prop>
<prop key="find*">PROPAGATION_REQUIRED,readOnly</prop>
<prop key="*">PROPAGATION_REQUIRED</prop>
</props>
</property>
</bean>


<bean id="daoMethodCacheInterceptor" class="com.danlong.common.interceptor.ThreadMethodCacheInterceptor">
</bean>

<bean id="hibernateMappingFileSetUtil" class="com.danlong.common.util.ListSetUtil">
<property name="prefix">
<value>hibernateMapping</value>
</property>
</bean>

<bean id="daoTemplate" abstract="true" class="com.danlong.common.dao.BaseDAO">
<property name="sessionFactory">
<ref local="sessionFactory"/>
</property>
<property name="dataSource">
<ref local="dataSource" />
</property>
<property name="cache">
<ref local="methodCache" />
</property>
</bean>

<bean id="common.baseDao" class="com.danlong.common.dao.BaseDAO" parent="daoTemplate"></bean>

<bean id="common.baseManager" parent="txProxyTemplate">
<property name="proxyInterfaces">
<list>
<value>com.danlong.common.service.Manager</value>
</list>
</property>
<property name="target">
<ref bean="com.danlong.common.service.imp.BaseManager"/>
</property>
</bean>


<bean id="com.danlong.common.service.imp.BaseManager" class="com.danlong.common.service.imp.BaseManager">
<property name="DAO">
<ref bean="common.baseDao"/>
</property>
</bean>


</beans>



当我查询到对象发到jsp页面后,检索对象mang-to-one对象属性是就报could not initialize proxy - the owning Session was closed错误。不是mang-to-one属性没问题。
...全文
170 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
hzl37du3 2009-09-03
  • 打赏
  • 举报
回复
我在配置文件中加了

<bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
<property name="beanNames">
<value>*Manager</value>
</property>
<property name="interceptorNames">
<list>
<value>TransactionInterceptor</value>
</list>
</property>
</bean>


也不起作用,不知道为什么
hzl37du3 2009-09-03
  • 打赏
  • 举报
回复
请问openInView怎么配置?我这样配置不行
xian_hf 2009-09-03
  • 打赏
  • 举报
回复
session 打开方式是什么? openInView 还是 open后close
hzl37du3 2009-09-03
  • 打赏
  • 举报
回复
问题解决了,谢谢大家,答案是在这里找到的
http://finally-m.javaeye.com/blog/456925
结贴了,回复的都有分哈,谢谢了
BearKin 2009-09-03
  • 打赏
  • 举报
回复
那就用filter吧 一般也是采用这种方式的 配置连接池应该就不用担心这个了 延迟加载少用为妙
hzl37du3 2009-09-03
  • 打赏
  • 举报
回复
不是一条,是普遍啊,lazy=false不好啊,估计要考虑filter了
BearKin 2009-09-03
  • 打赏
  • 举报
回复
以前我也发过这种帖子问过其他人 具体解决办法有很多

OpenSessionInView这个我没实验过 不过据说不是很好 LZ可以尝试下

或者在每次开启一个页面的时候在Filter同时开启一个事务 当离开的时候关闭这个事务 这样也是可以的

再或者就是将延迟加载给去掉 lazy=false

LZ你想要延迟加载的数据是什么? 如果只是一条的话就没必要延迟加载了吧?
hzl37du3 2009-09-03
  • 打赏
  • 举报
回复
我已经把代理类配置到了action层,可以实现在action层延时加载了,配置文件是这样的:

<bean name="/spot/spotManager" abstract="true">
<property name="spotManager">
<ref bean="spot.spotManager"/>
</property>
</bean>
<bean name="/spotContentAction" class="com.danlong.spot.action.SpotContentAction"
singleton="false" parent="/spot/spotManager">
</bean>

<bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
<property name="beanNames">
<list>
<value>/spotContentAction</value>
</list>
</property>
<property name="interceptorNames">
<list>
<value>TransactionInterceptor</value>
</list>
</property>
</bean>


但是还是不能在jsp里面延迟加载数据,如果在action里面查询过对象,jsp里面就会有,否则还是报错。

总的来说我的延迟加载配置是对的,现在的问题就是怎么实现延迟加载的拦截器控制到jsp层

81,092

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧