Session/EntityManager is closed


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;
    }

}
View Code

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM