Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring &引用;找不到当前线程的会话“;将服务类标记为事务类时DAO中出错_Spring_Hibernate_Transactions_Annotations - Fatal编程技术网

Spring &引用;找不到当前线程的会话“;将服务类标记为事务类时DAO中出错

Spring &引用;找不到当前线程的会话“;将服务类标记为事务类时DAO中出错,spring,hibernate,transactions,annotations,Spring,Hibernate,Transactions,Annotations,使用Hibernate4和Spring3.1。就我而言,这可能是缺乏理解。我在服务类中有一个方法,它调用DAO类中的一个方法来使用Hibernate检索一些数据。我用@Transactional注释服务方法,但在DAO方法中调用getCurrentSession时出错。如果我也用@Transactional注释DAO方法,那么数据将被成功检索。我不明白为什么——我本以为服务方法上的@Transactional注释会创建一个Hibernate会话,将其绑定到线程,并且在调用getCurrentSe

使用Hibernate4和Spring3.1。就我而言,这可能是缺乏理解。我在服务类中有一个方法,它调用DAO类中的一个方法来使用Hibernate检索一些数据。我用@Transactional注释服务方法,但在DAO方法中调用getCurrentSession时出错。如果我也用@Transactional注释DAO方法,那么数据将被成功检索。我不明白为什么——我本以为服务方法上的@Transactional注释会创建一个Hibernate会话,将其绑定到线程,并且在调用getCurrentSession时,该会话会在DAO类中返回。谁能解释一下为什么会这样,或者我做错了什么,谢谢

<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获取服务实例的。很高兴我能帮忙!