標籤:
1、session的clear()方法
hibernate從資料庫中get或load記錄時,或先去session一級緩衝中尋找對應資料,如果緩衝中沒有記錄,則去對應資料庫中查詢,
如果有記錄則直接從緩衝中擷取。
public void testClear() { Session session1 = sf.getCurrentSession(); session1.beginTransaction(); Student t1 = (Student) session1.get(Student.class, 45); //session1.clear(); Student t2 = (Student) session1.get(Student.class, 45); session1.getTransaction().commit(); }
執行時只會發出一次查詢
Hibernate: select student0_.id as id1_0_0_, student0_.age as age2_0_0_, student0_.name as name3_0_0_ from Student student0_ where student0_.id=?
加上session的clear()方法後,會清空當前session緩衝,資料庫查詢兩次,如下:
Hibernate: select student0_.id as id1_0_0_, student0_.age as age2_0_0_, student0_.name as name3_0_0_ from Student student0_ where student0_.id=?
Hibernate: select student0_.id as id1_0_0_, student0_.age as age2_0_0_, student0_.name as name3_0_0_ from Student student0_ where student0_.id=?
2、session的flush方法
flush方法會強制同步當前session快取資料至資料庫中,如下:
@Test public void testFlush() { Session session1 = sf.getCurrentSession(); session1.beginTransaction(); Student t1 = (Student) session1.get(Student.class, 45); t1.setAge(30); t1.setAge(40); session1.getTransaction().commit(); }
此時資料庫中load出對應記錄後,雖然前後連續更改了兩次屬性,資料庫只執行一次update
Hibernate: update Student set age=?, name=? where id=?
加上flush後:
public void testFlush() { Session session1 = sf.getCurrentSession(); session1.beginTransaction(); Student t1 = (Student) session1.get(Student.class, 45); t1.setAge(30); session1.flush(); t1.setAge(40); session1.getTransaction().commit(); }
資料庫連續執行兩次update
Hibernate: update Student set age=?, name=? where id=?
Hibernate: update Student set age=?, name=? where id=?
hibernate學習6_session之clear與flush