Hinbernate操作數據庫必須要開啟事務, 但是在添加事務的時候遇到這個問題也是郁悶,
說Session被關閉了, 而這個Session又是必須的.
關鍵是我並沒有關閉, 也找不到是哪里被關閉了的.
我把代碼改成如下的樣子, 則是可以運行的, 在執行之前,開啟事務
/** * 查詢用戶 * @param uid * @return
*/ @Override public User get(Integer uid) {
Transaction transaction = session.beginTransaction(); User user = null; try { user = session.get(User.class,uid);
transaction.commit(); } catch(Exception e) { e.printStackTrace();
transaction.rollback(); } return user; }
原因分析: 每次調用了session之后, 在事務提交了以后就會把session關閉
這是因為Hibernate會維護這個Session, 在我提交事務的時候關閉Session
解決思路: 在代碼執行之前, 開啟Session, 添加如下代碼:
@Override
public User get(Integer uid) {
Session session = HibernateUtil.getSession();
return session.get(User.class,uid);
}
問題解決!
附HibernateUtil的代碼:

package com.bj186.crm.factory; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; /** * Hinbernate工具類 */ public class HibernateUtil { private static SessionFactory sessionFactory; private HibernateUtil() { } static { //1. 聲明配置對象,加載配置文件 Configuration configuration = new Configuration(); configuration.configure("hibernate.cfg.xml"); //2. 將配置文件告訴session工廠 sessionFactory = configuration.buildSessionFactory(); } //獲取session工廠 public static Session getSession() { if(sessionFactory !=null ) { return sessionFactory.getCurrentSession(); } return null; } }