【问题标题】:migration to hibernate 4 + spring 4.2.2: org.hibernate.HibernateException: Could not obtain transaction-synchronized Session for current thread迁移到休眠 4 + spring 4.2.2:org.hibernate.HibernateException:无法获取当前线程的事务同步会话
【发布时间】:2015-11-04 12:35:06
【问题描述】:

我正在迁移到 spring 4.2.2.RELEASE 和 hibernate 5 并得到以下异常:

hibernate 4也出现异常:

Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'NotificationService' defined in class path resource [business-context.xml]: Error setting property values; nested exception is org.springframework.beans.PropertyBatchUpdateException; nested PropertyAccessExceptions (1) are:
PropertyAccessException 1: org.springframework.beans.MethodInvocationException: Property 'lovDao' threw exception; nested exception is org.hibernate.HibernateException: Could not obtain transaction-synchronized Session for current thread
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1518)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1226)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:543)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:305)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:301)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:196)
    at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:351)
    ... 127 more
Caused by: org.springframework.beans.PropertyBatchUpdateException; nested PropertyAccessExceptions (1) are:
PropertyAccessException 1: org.springframework.beans.MethodInvocationException: Property 'lovDao' threw exception; nested exception is org.hibernate.HibernateException: Could not obtain transaction-synchronized Session for current thread
    at org.springframework.beans.AbstractPropertyAccessor.setPropertyValues(AbstractPropertyAccessor.java:121)
    at org.springframework.beans.AbstractPropertyAccessor.setPropertyValues(AbstractPropertyAccessor.java:75)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1514)
    ... 135 more
:org.springframework.beans.PropertyBatchUpdateException:Failed properties: Property 'lovDao' threw exception; nested exception is org.hibernate.HibernateException: Could not obtain transaction-synchronized Session for current thread
    at org.springframework.beans.AbstractPropertyAccessor.setPropertyValues(AbstractPropertyAccessor.java:121)
    at org.springframework.beans.AbstractPropertyAccessor.setPropertyValues(AbstractPropertyAccessor.java:75)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1514)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1226)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:543)
    Truncated. see log file for complete stacktrace

这是 'lovDao' bean 的定义:

<bean id="ListOfValuesDao" class="be.fgov.just.cjr.dao.core.ListOfValuesDaoImpl">
    <property name="sessionFactory" ref="sessionFactory"/>
</bean>

以及 dao-context.xml 的相关部分:

<!-- Enable the configuration of transactional behavior based on annotations -->
<bean id="transactionManager" name="transactionManager"
      class="org.springframework.orm.hibernate5.HibernateTransactionManager">
    <property name="sessionFactory" ref="sessionFactory"/>
</bean>

<!-- Enable the configuration of transactional behavior based on annotations -->
<tx:annotation-driven transaction-manager="transactionManager"/>

<context:component-scan base-package="be.fgov.just.cjr.dao" />

<bean id="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
    <property name="dataSource" ref="datasource"/>
    <property name="packagesToScan" value="be.fgov.just.cjr.model"/>
    <property name="hibernateProperties">
        <props>
            <prop key="hibernate.bytecode.use_reflection_optimizer">true</prop>
            <prop key="hibernate.dialect">be.fgov.just.cjr.oracle.OracleDialectWithXmlTypeSupport</prop>
            <prop key="hibernate.search.autoregister_listeners">false</prop>
            <prop key="hibernate.transaction.factory_class">org.hibernate.engine.transaction.internal.jta.JtaTransactionFactory</prop>
            <prop key="hibernate.use_sql_comments">true</prop>
            <prop key="hibernate.generate_statistics">true</prop>
            <prop key="hibernate.cache.use_structured_entries">true</prop>
            <prop key="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</prop>
            <prop key="hibernate.cache.use_query_cache">true</prop>
            <prop key="hibernate.cache.use_second_level_cache">true</prop>
            <prop key="hibernate.show_sql">false</prop>
        </props>
    </property>
</bean>

现在,这是 lovDao 的类定义:

@Transactional 
//@Repository removed for testing (didn't work)
public class ListOfValuesDaoImpl extends GenericDaoImpl implements ListOfValuesDao {

GenericDaoImpl 也是事务性的

@Transactional
//@Repository removed for testing (didn't work)
public class GenericDaoImpl implements GenericDao {

为什么lovDao不能获取事务同步的Session?

ListOfValuesDaoImpl 一开始不是事务性的,但抛出了完全相同的异常; GenericDaoImpl 是。

GenericDao 也是事务性的:(不再)

//@Transactional removed for testing (didn't work)
//@Repository removed for testing (didn't work)
public interface GenericDao {

我知道围绕 SO 提出了类似的问题,但我已经尝试了很多指针并阅读了很多指南,但似乎没有任何效果......

感谢指点/帮助/批评意见;)

S.

编辑:

sessionFactory 设置在 GenericDaoImpl...:

private SessionFactory sessionFactory;

@Autowired
public void setSessionFactory(SessionFactory sessionFactory) {
    this.sessionFactory = sessionFactory;
}

(我添加了 @Qualifier("sessionFactory") 因为 IntelliJ 抱怨多个 bean(实际上指向同一个 bean)) -> 我检查了 dao-context.xml 是否被多次使用,但不是

...并且(在同一类中)会话是这样获得的:

public Session getSession() {
    return sessionFactory.getCurrentSession();
}

编辑 2(对 GUISSOUMA Issam 答案编辑的反应):

我也有这样的豆子:

<bean id="DossierDao" class="be.fgov.just.cjr.dao.dossier.DossierDaoImpl">
    <property name="sessionFactory" ref="sessionFactory"/>
    <property name="lovDao" ref="ListOfValuesDao"/>
    <property name="dossierValidator" ref="DossierValidator"/>
</bean>

我该怎么处理这些?

(他们引用 ListOfValuesDao...) (@Autowiring 似乎没有帮助(根据 IntelliJ)它没有找到对 ListOfValuesDao 的引用)

-> 我移除时也会出现同样的异常:

<context:component-scan base-package="be.fgov.just.cjr.dao" />

ps:感谢您坚持不懈地帮助我,问题是我现在无法测试东西,因为我是在家写的(并且无法到达办公室的环境:( -> 如果您提供一些建议,我明天可以尝试,但目前我只能依赖 IDE 的输出 :( -> 我会尽量提供尽可能多的信息

我在 GenericDaoImpl 中也有这个:

private SessionFactory sessionFactory;

@Autowired
public void setSessionFactory(SessionFactory sessionFactory) {
    this.sessionFactory = sessionFactory;
}

结合:

<bean id="GenericDao" class="be.fgov.just.cjr.dao.GenericDaoImpl">
    <property name="sessionFactory" ref="sessionFactory"/>
</bean>

根据答案的编辑,我想这会导致问题吗? (明天早上我才能确定……)

编辑 3:我得到了相当多的新信息,我没有将其全部附加到这里,而是 created a new question...

【问题讨论】:

    标签: java spring hibernate transactions


    【解决方案1】:

    将@Repository 注释添加到您的DAO。

    删除此声明

    <bean id="ListOfValuesDao" class="be.fgov.just.cjr.dao.core.ListOfValuesDaoImpl">
        <property name="sessionFactory" ref="sessionFactory"/>
    </bean>
    

    来自您的 XML

    因为你有这个:

    <context:component-scan base-package="be.fgov.just.cjr.dao" />
    

    确保您的包裹只被扫描一次(在一个 xml 文件中声明)

    【讨论】:

    • 不,没有解决问题(同样的例外)(我还添加了 (a)Repository 到具有 (a)Transactional 无济于事的父母......)((a) 表示 @但评论框不喜欢那样;)
    • 如何从 sessionFactory 获取会话?
    • 我也在编辑中添加了它:IntelliJ 抱怨 sessionFactory bean 被多次使用(但经过检查,这些引用指向同一个 bean)
    • 删除这个声明
    • 我有依赖 ListOfValuesDao 的 bean; (在同一个包中)我该怎么处理这些?
    【解决方案2】:

    我不太确定是什么“解决”了这个问题,但我确实得到了:

    org.hibernate.HibernateException:Unable to locate current JTA transaction
    

    现在异常(所以这个问题已经解决了,我希望(如果我没有通过迁移过程再次得到这个异常,我会将我的答案设置为正确答案)

    我认为“无法定位当前 JTA 事务”异常是由于我的上述配置+添加:

    <prop key="hibernate.current_session_context_class">jta</prop>
    

    到:

    <bean id="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
            <property name="dataSource" ref="datasource"/>
            <property name="packagesToScan" value="be.fgov.just.cjr.model"/>
            <property name="hibernateProperties">
                <props>
    

    但我不确定这是否是问题之上或之下的一个例外......

    我不一定完全遵循 GUISSOUMA Issam,但他给了我一些很好的指示,所以我会赞成他的回应......

    待续……

    【讨论】:

      猜你喜欢
      • 2016-11-14
      • 2014-12-04
      • 2015-04-04
      • 1970-01-01
      • 2015-03-11
      • 2015-04-11
      • 2015-09-22
      • 2014-11-29
      相关资源
      最近更新 更多