1. 程式人生 > >關於Hibernate Could not obtain transaction-synchronized Session for current thread

關於Hibernate Could not obtain transaction-synchronized Session for current thread

最近幾年一直再搞android,最近閒下來了,順便玩一下web。

整了個最新版本的SSH(hibernate5.1.0+spring4.2.6+struts-2.5)

在寫dao實現類的時候碰到一個問題,

@Repository
public class UserDaoImpl implements IUserDao {

	@Autowired
	private SessionFactory sessionFactory;

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


用了sessionFactory.getCurrentSession()這個之後,會提示

org.hibernate.HibernateException: Could not obtain transaction-synchronized Session for current thread 這個異常。(據說hibernate 4以上的版本才會有)

這裡可以用Session session = sessionFactory.openSession(),然後程式碼中去關閉 session.close.當然為了偷懶的原則

必須不自己去管理session。讓Spring容器自己去處理。

研究了一下。發現 只要在

applicationContext.xml 中追加

 <!-- 配置事務管理器 --> 
    <bean id="transactionManager" class="org.springframework.orm.hibernate5.HibernateTransactionManager"> 
        <property name="sessionFactory" ref="sessionFactory"></property> 
    </bean>
     
    <tx:annotation-driven transaction-manager="transactionManager"/>


然後再在實現類加上@Transactional

@Repository
@Transactional
public class UserDaoImpl implements IUserDao {

	@Autowired
	private SessionFactory sessionFactory;

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


這樣問題就完美解決了。