【发布时间】: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