Spring &引用;找不到当前线程的会话“;将服务类标记为事务类时DAO中出错
使用Hibernate4和Spring3.1。就我而言,这可能是缺乏理解。我在服务类中有一个方法,它调用DAO类中的一个方法来使用Hibernate检索一些数据。我用@Transactional注释服务方法,但在DAO方法中调用getCurrentSession时出错。如果我也用@Transactional注释DAO方法,那么数据将被成功检索。我不明白为什么——我本以为服务方法上的@Transactional注释会创建一个Hibernate会话,将其绑定到线程,并且在调用getCurrentSession时,该会话会在DAO类中返回。谁能解释一下为什么会这样,或者我做错了什么,谢谢Spring &引用;找不到当前线程的会话“;将服务类标记为事务类时DAO中出错,spring,hibernate,transactions,annotations,Spring,Hibernate,Transactions,Annotations,使用Hibernate4和Spring3.1。就我而言,这可能是缺乏理解。我在服务类中有一个方法,它调用DAO类中的一个方法来使用Hibernate检索一些数据。我用@Transactional注释服务方法,但在DAO方法中调用getCurrentSession时出错。如果我也用@Transactional注释DAO方法,那么数据将被成功检索。我不明白为什么——我本以为服务方法上的@Transactional注释会创建一个Hibernate会话,将其绑定到线程,并且在调用getCurrentSe
<tx:annotation-driven transaction-manager="transactionManager"/>
root-context.xml:
<tx:annotation-driven transaction-manager="transactionManager"/>
DAO类:
<tx:annotation-driven transaction-manager="transactionManager"/>
private SessionFactory sessionFactory;
public void setSessionFactory(SessionFactory sessionFactory) {
this.sessionFactory = sessionFactory;
}
public Blah GetMostRecentBlah() {
return (Blah)sessionFactory.getCurrentSession().createQuery("from Blah where blahID = (select max(blahID) from Blah)").uniqueResult();
}
错误:
<tx:annotation-driven transaction-manager="transactionManager"/>
org.hibernate.HibernateException: No Session found for current thread
org.springframework.orm.hibernate4.SpringSessionContext.currentSession(SpringSessionContext.java:97)
org.hibernate.internal.SessionFactoryImpl.getCurrentSession(SessionFactoryImpl.java:1039)
com.blah.blah.DAO.BlahDAOImpl.GetMostRecentBlah(BlahDAOImpl.java:18)
正如我所说,如果我用@Transactionall(以及服务方法)注释DAO函数,这是可行的,但我不明白为什么。有两个可能的原因
<tx:annotation-driven transaction-manager="transactionManager"/>
1) 您的服务bean位于单独的ApplicationContext中,它没有启用注释驱动事务
<tx:annotation-driven transaction-manager="transactionManager"/>
2) 您正在获取对服务实例的引用,该实例是原始实例,而不是代理实例,因此是事务实例
<tx:annotation-driven transaction-manager="transactionManager"/>
要确定哪一个是您的问题,或者确定它是否是其他问题,请显示导致创建服务bean的上下文文件,并显示获取服务实例的代码。解决方案可能是:
<tx:annotation-driven transaction-manager="transactionManager"/>
<tx:annotation-driven proxy-target-class="true" transaction-manager="transactionManager" />
我们能看看调用服务的代码吗?还有你的DAOFactory是什么样子的?或者3)我的服务类甚至没有声明为Bean!我告诉过你我是新手,这实际上属于2):你是通过直接调用服务实例的构造函数而不是从Spring获取服务实例的。很高兴我能帮忙!