使用休眠 4 和 Spring 3.1。刚刚启动并运行它,所以这可能是我缺乏理解。我在 Service 类中有一个方法,它调用 DAO 类中的一个方法来使用 Hibernate 检索一些数据。我使用 @Transactional 注释 Service 方法,但在 DAO 方法中调用 getCurrentSession 时出错。如果我也用 @Transactional 注释 DAO 方法,则成功检索数据。我不明白为什么——我会认为 Service 方法上的 @Transactional 注释会创建一个 Hibernate 会话,将其绑定到线程,并且当调用 getCurrentSession 时,该会话将在 DAO 类中返回。谁能解释为什么会这样,或者我做错了什么,谢谢?
根上下文.xml:
<tx:annotation-driven transaction-manager="transactionManager"/>
服务等级:
public class BlahServiceImpl implements BlahService {
@Transactional
public Blah GetMostRecentBlah() {
BlahDAO blahDAO = DAOFactory.GetBlahDAO();
return blahDAO.GetMostRecentBlah();
}
}
DAO类:
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();
}
错误:
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)
就像我说的,如果我用 @Transactioanl (以及 Service 方法)注释 DAO 函数,这是可行的,但我不明白为什么。