java - Hibernate 事务的 session 问题

标签 java hibernate spring transactions

我是 hibernate 新手,并尝试将 hibernate 与现有的基于 spring 的应用程序集成。

我配置了 session 工厂和事务管理器、事务代理模板。

我还在这个应用程序中使用 Quartz 调度程序。

当我运行该应用程序时,出现以下异常。

错误 au.com.michaelpage.ctsgui.utils.OrganizationMergeProfileThread - 更新机会时出错:无法打开 Hibernate session 进行事务;嵌套异常是 java.lang.IllegalStateException:键 [weblogic.jdbc.common.internal.RmiDataSource@32b034] 的值 [org.springframework.jdbc.datasource.ConnectionHolder@9f6885] 已经绑定(bind)到线程 [DefaultQuartzScheduler_Worker-0]

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

这是“organizationMergeJob”的 bean 定义

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

有什么办法可以解决这个问题吗?

提前谢谢您。

<小时/>

嗨斯卡夫曼,

这是错误的堆栈跟踪:

 Could not open Hibernate Session for transaction; nested exception is java.lang.IllegalStateException: Already value [org.springframework.jdbc.datasource.ConnectionHolder@5f2fb8] for key [weblogic.jdbc.common.internal.RmiDataSource@326b7b] bound to thread [DefaultQuartzScheduler_Worker-3]
Caused by: java.lang.IllegalStateException: Already value [org.springframework.jdbc.datasource.ConnectionHolder@5f2fb8] for key [weblogic.jdbc.common.internal.RmiDataSource@326b7b] 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)

谢谢。

这是“organizationMergeMgr”的 bean 定义

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

最佳答案

我想查看organizationMergeMgr的代码,但我的猜测是,您的事务在不应该的情况下保持打开状态,因为在所有情况下都没有进行显式的提交或回滚调用(即使您认为它将始终参与更大的事务,必须进行这些调用以保证事务资源的清理)

关于java - Hibernate 事务的 session 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1870600/

相关文章:

hibernate - 为什么 TypedQuery.getResultList() 用单独的 SELECT 解析每个 ManyToOne 关联?

java - JPA/Hibernate 映射 : “QuerySyntaxException: Player is not mapped…”

java - 如何模拟 Springockito 模拟的行为?

java - 在 Java 8 中使用映射函数时类型转换不起作用

java - 从Java中的2个表中删除行

java - 我是否需要以不同方式导出 .jar 以在不同平台上运行?

java - 如何用JPA注解Map<Entity,INTEGER>?

java - Spring MVC 重写 ResourceHttpRequestHandler

spring - 更改 Spring Cloud Config 的路径

java - 在Android中的自定义 View 中设置imageview的大小和位置