閱讀380 返回首頁    go 阿裏雲 go 技術社區[雲棲]


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

  上一篇:go android去掉標題欄、信息欄、獲取屏幕分辨率、圖片全屏
  下一篇:go 模擬hibernate實現的JAVA源碼