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