2009-12-08 7 views
1

Je suis nouveau à hiberner et à essayer d'intégrer hibernate à une application basée sur un ressort existant.Problème de session Hibernate pour les transactions

J'ai configuré l'atelier de session et le gestionnaire de transactions, modèle de proxy de transaction. J'utilise également Quartz Scheduler dans cette application.

Lorsque j'exécute l'application, j'obtiens l'exception suivante.

ERROR au.com.michaelpage.ctsgui.utils.OrganisationMergeProfileThread - Erreur lors de la mise à jour de l'opportunité: Impossible d'ouvrir la session Hibernate pour la transaction; exception imbriquée est java.lang.IllegalStateException: Valeur Déjà [[email protected]] pour la touche [[email protected]] lié à enfiler [DefaultQuartzScheduler_Worker-0]

Ma configuration de la session de mise en veille prolongée:

<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> 

Ma configuration du planificateur de 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> 

Voici la définition de haricot pour '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> 

Toute aide à résoudre ce problème?

Merci d'avance.


Salut skaffman,

Voici la trace de la pile de l'erreur:

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) 

Merci.

Voici la définition de haricot pour « organisationMergeMgr »

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

Nous aurons besoin de voir la définition du bean pour 'organisationMergeJob', plus tous les autres beans qui le relient à la fabrique de sessions. En outre, la trace de pile de l'exception serait utile. – skaffman

+0

Salut skaffman, Merci pour la réponse. Voici la définition du bean pour 'organisationMergeJob' \t \t \t Je posterai la trace de la pile séparement. – Jani

+0

J'ai ajouté que le haricot à la question. Nous sommes toujours 'organisationMergeMgr' manque, cependant. – skaffman

Répondre

0

Je voudrais voir le code pour la organisationMergeMgr mais je pense serait que vous avez des transactions restent ouverts quand ils ne sont pas censés parce qu'il ya aucun appel de validation ou d'annulation explicite effectué dans toutes les situations (même si vous pensez qu'il participera toujours à une transaction plus importante, ces appels doivent être effectués pour garantir le nettoyage des ressources transactionnelles)

Questions connexes