1. 程式人生 > >Hibernate中session.flush()會不會去資料庫執行SQL語句

Hibernate中session.flush()會不會去資料庫執行SQL語句

首先可以確定的是,如果不提交事務的話,雖然會生成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了。