Hibernate中session.flush()會不會去資料庫執行SQL語句
阿新 • • 發佈:2019-02-04
首先可以確定的是,如果不提交事務的話,雖然會生成SQL語句,但資料庫中的資料並不會改變
測試程式碼如下:
首先我的資料庫中有這些條資料,實體物件為UserModel
程式碼如下
Session session = HibernateUtil.getSession(); Transaction transaction = session.beginTransaction(); UserModel um = new UserModel(); um.setUuid(8l); um.setUserName("update"); um.setAge(30); um.setAddress("addr"); <strong>session.update(um); <span style="color:#FF0000;">transaction.commit();</span></strong> um.setAge(1000); <strong>session.flush();</strong> System.out.println("====================="); UserModel um2 = (UserModel) session.get(UserModel.class, 8l); System.out.println(um2.getAge()); HibernateUtil.closeAll(session);
程式碼執行後的結果:
Hibernate: update tbl_user set userName=?, age=?, address=? where uuid=?
Hibernate: update tbl_user set userName=?, age=?, address=? where uuid=?
=====================
1000
程式碼執行後資料庫資料的變化如下圖:
從上面結果可以看出,雖然生成了2條SQL語句,但是真正起效果的是在事務提交之前生成的那條update語句。Hibernate中session 執行完update語句話,會將物件載入到一級快取中。而我上面的程式碼,在提交完事務後,又對相同 OID的物件進行了修改,當重新整理快取的時候,由於當前物件 也就是哪個um和一級快取中儲存的資料不一樣,因此Hibernate會生成一條SQL語句,但是由於並沒有提交事務,雖然SQL語句生成了,但是資料庫依然是沒有變化的。
上面的程式碼,在重新整理一級快取後,又用session中的get方法去查詢資料。因為get方法會先去一級快取中驗證是否有資料,如果有則取的是一級快取中的資料。所以後面拿到的資料其實是一級快取中的。如果這裡的程式碼改成用SQL語句去查詢的話,拿到的資料結果就不會是1000了。