hibernate的session判斷-openSession和getCurrentSession
1.openSession永遠打開新的session(打開新的)
2.getCurrentSession,如果當前環境已經有session則用當前session(可能打開新的也可能用以前已經存在的)
代碼判斷:
@Test public void testTeacherSave() { Teacher t = new Teacher(); t.setName("t1"); t.setTitle("middle"); t.setBirthDate(new Date()); Session session = sessionFactory.openSession(); session.beginTransaction(); session.save(t); session.getTransaction().commit(); session.close(); Session session2 = sessionFactory.openSession(); System.out.println(session == session2); }
輸出:
false
再如:
@Test public void testTeacherSave() { Teacher t = new Teacher(); t.setName("t1"); t.setTitle("middle"); t.setBirthDate(new Date()); //Session session = sessionFactory.openSession(); Session session = sessionFactory.getCurrentSession(); session.beginTransaction(); session.save(t); Session session2 = sessionFactory.getCurrentSession(); System.out.println(session == session2); session.getTransaction().commit(); Session session3 = sessionFactory.getCurrentSession(); System.out.println(session == session3); }
輸出:
true
false
一個關於openSession和getCurrentSession的分析:
DAO: DATA ACESS OBJECT
如上圖所示:userDAO和logDAO都會調用hibernate的sessionsave()方法
問題:這兩個操作能否放在同一事務裏?
事務:要麼這兩個操作同時完成,要麼一個都不完成。事務的英文:transaction
userDAO和logDAO需要放在同一事務裏,所以同時使用opensession()有問題。
事務邊界應該放在addUser()裏,所以需要用getCurrentSession。
openSession和getCurrentSession不能混用!這兩種方法獲得的session不是同一個!
最後更新:2017-04-02 17:28:38