2009-12-08 126 views
1

我是新的休眠,並試圖將休眠與現有的基於彈簧的應用程序集成。休眠會話問題的交易

我配置了會話工廠和事務管理器,事務代理模板。

我也在這個應用程序中使用Quartz調度器。

當我運行該應用程序時,出現以下異常。

錯誤au.com.michaelpage.ctsgui.utils.OrganisationMergeProfileThread - 更新機會時出錯:無法打開Hibernate Session進行交易;嵌套的異常是java.lang.IllegalStateException:已將值[[email protected]]綁定到線程[DefaultQuartzScheduler_Worker-0]的密鑰[[email protected]]

我Hibernate的Session配置:

<bean id="sessionFactoryAU" 
    class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> 
    <property name="dataSource"> 
     <ref bean="profileAU" /> 
    </property> 
    <property name="mappingResources"> 
     <list> 
      <value> 
       /au/com/michaelpage/ctsgui/hibernate/dao/mappings/Opportunity.hbm.xml 
      </value> 
      <value> 
       /au/com/michaelpage/ctsgui/hibernate/dao/mappings/Position.hbm.xml 
      </value> 
      <value> 
       /au/com/michaelpage/ctsgui/hibernate/dao/mappings/EventRole.hbm.xml 
      </value> 
     </list> 
    </property> 
    <property name="hibernateProperties"> 
     <props> 
      <!-- Database Settings --> 
      <prop key="hibernate.dialect"> 
       org.hibernate.dialect.SybaseDialect 
      </prop> 
      <prop key="hibernate.query.factory_class"> 
       org.hibernate.hql.ast.ASTQueryTranslatorFactory 
      </prop> 

      <!-- Cache settings --> 
      <prop key="hibernate.cache.provider_class"> 
       org.hibernate.cache.EhCacheProvider 
      </prop> 
     </props> 
    </property> 
</bean> 

<!-- Transaction manager for a Hibernate SessionFactory --> 
<bean id="txManager" 
    class="org.springframework.orm.hibernate3.HibernateTransactionManager"> 
    <property name="sessionFactory"> 
     <ref bean="sessionFactoryAU" /> 
    </property> 
</bean> 

<!-- Transaction template for Managers --> 
<bean id="txProxyTemplateHibernateProfileAU" abstract="true" 
    class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"> 
    <property name="transactionManager"> 
     <ref bean="txManager" /> 
    </property> 
    <property name="transactionAttributes"> 
     <props> 
      <prop key="create*">PROPAGATION_REQUIRED</prop> 
      <prop key="save*">PROPAGATION_REQUIRED</prop> 
      <prop key="update*">PROPAGATION_REQUIRED</prop> 
      <prop key="delete*">PROPAGATION_REQUIRED</prop> 
      <prop key="remove*">PROPAGATION_REQUIRED</prop> 
      <prop key="get*">PROPAGATION_SUPPORTS</prop> 
     </props> 
    </property> 
</bean> 

<bean id="organisationMergeProfileMgrAU" 
    parent="txProxyTemplateHibernateProfileAU"> 
    <property name="target"> 
     <bean 
      class="au.com.michaelpage.ctsgui.mgr.profile.OrganisationMergeProfileMgrImpl"> 
      <property name="commonProfileDao"> 
       <ref bean="commonProfileDaoAU" /> 
      </property> 
      <property name="organisationMergeProfileDao"> 
       <ref bean="organisationMergeDaoAU" /> 
      </property> 
      <property name="hibernateOrganisationDAO"> 
       <ref bean="hibernateOrganisationDAOAU" /> 
      </property> 
      <property name="hibernateOpportunityDAO"> 
       <ref bean="hibernateOpportunityDAOAU" /> 
      </property> 
      <property name="hibernatePositionDAO"> 
       <ref bean="hibernatePositionDAOAU" /> 
      </property> 
      <property name="hibernateEventRoleDAO"> 
       <ref bean="hibernateEventRoleDAOAU" /> 
      </property> 
     </bean> 
    </property> 
</bean> 

我Quartz調度配置:

<bean id="organisationMergeJobDetail" 
    class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"> 
    <property name="targetObject" ref="organisationMergeJob" /> 
    <property name="targetMethod" value="execute" /> 
    <property name="concurrent" value="false" /> 
</bean> 

<bean id="organisationMergeProfileRegularCheckerTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean"> 
    <property name="jobDetail" ref="organisationMergeJobDetail" /> 
    <property name="repeatInterval"> 
     <util:constant static-field="au.com.michaelpage.ctsgui.common.Constants.CHECK_FREQUENCY" /> 
    </property> 
</bean> 

這裏是 'organisationMergeJob'

<bean id="organisationMergeJob" class="au.com.michaelpage.ctsgui.utils.OrganisationMergeProfileThread"> 
    <property name="organisationMergeMgr" ref="organisationMergeMgr"/> 
</bean> 

<bean id="organisationMergeMgr" class="au.com.michaelpage.ctsgui.mgr.OrganisationMergeMgrImpl"> 
    <property name="organisationMergeDao" ref="organisationMergeDao"/> 
</bean> 

任何有助於解決這個bean定義?

預先感謝您。


skaffman嗨,

以下是錯誤的堆棧跟蹤:

Could not open Hibernate Session for transaction; nested exception is java.lang.IllegalStateException: Already value [[email protected]] for key [[email protected]] bound to thread [DefaultQuartzScheduler_Worker-3] 
Caused by: java.lang.IllegalStateException: Already value [[email protected]] for key [[email protected]] bound to thread [DefaultQuartzScheduler_Worker-3] 
    at org.springframework.transaction.support.TransactionSynchronizationManager.bindResource(TransactionSynchronizationManager.java:163) 
    at org.springframework.orm.hibernate3.HibernateTransactionManager.doBegin(HibernateTransactionManager.java:526) 
    at org.springframework.transaction.support.AbstractPlatformTransactionManager.getTransaction(AbstractPlatformTransactionManager.java:350) 
    at org.springframework.transaction.interceptor.TransactionAspectSupport.createTransactionIfNecessary(TransactionAspectSupport.java:262) 
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:101) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171) 
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204) 
    at $Proxy73.updateEventRole(Unknown Source) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    at java.lang.reflect.Method.invoke(Method.java:597) 
    at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:304) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:182) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:149) 
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:106) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171) 
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:106) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171) 
    at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:89) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171) 
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204) 
    at $Proxy73.updateEventRole(Unknown Source) 
    at au.com.michaelpage.ctsgui.utils.OrganisationMergeProfileThread.execute(OrganisationMergeProfileThread.java:100) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    at java.lang.reflect.Method.invoke(Method.java:597) 
    at org.springframework.util.MethodInvoker.invoke(MethodInvoker.java:283) 
    at org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean$MethodInvokingJob.executeInternal(MethodInvokingJobDetailFactoryBean.java:272) 
    at org.springframework.scheduling.quartz.QuartzJobBean.execute(QuartzJobBean.java:86) 
    at org.quartz.core.JobRunShell.run(JobRunShell.java:203) 
    at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:520) 

謝謝。

下面是bean定義「organisationMergeMgr」

<bean id="organisationMergeMgr" 
    class="au.com.michaelpage.ctsgui.mgr.OrganisationMergeMgrImpl"> 
    <property name="organisationMergeDao" ref="organisationMergeDao"/> 
</bean> 
+2

我們需要查看bean的定義'organisationMergeJob',以及將其連接到會話工廠的任何其他bean。另外,來自異常的堆棧跟蹤將很有用。 – skaffman 2009-12-08 23:34:08

+0

嗨skaffman, 感謝您的答覆。 這裏是bean的定義'organisationMergeJob' \t \t <屬性名=」 organisationMergeMgr」 REF = 「organisationMergeMgr」/> \t 我會seperately張貼堆棧跟蹤。 – Jani 2009-12-09 00:01:32

+0

我添加了綠豆的問題。我們還在缺少'organisationMergeMgr',雖然。 – skaffman 2009-12-09 00:09:05

回答

0

我想看到的organisationMergeMgr的代碼,但我的猜測是,你必須保持開放的交易時,不應該因爲他們有沒有在所有情況下都做出明確的提交或回滾調用(即使您認爲它總是會參與更大的事務,但必須保證清理事務資源)