天天看點

session的作用及使用時的注意點

最近學習了hibernate,對涉及到的session做一個簡單總結!!!!!!

一:

* flush: 使資料表中的記錄和 Session 緩存中的對象的狀态保持一緻. 為了保持一緻, 則可能會發送對應的 SQL 語句.

* 1. 在 Transaction 的 commit() 方法中: 先調用 session 的 flush 方法, 再送出事務

* 2. flush() 方法會可能會發送 SQL 語句, 但不會送出事務. 

* 3. 注意: 在未送出事務或顯式的調用 session.flush() 方法之前, 也有可能會進行 flush() 操作.

* 1). 執行 HQL 或 QBC 查詢, 會先進行 flush() 操作, 以得到資料表的最新的記錄

* 2). 若記錄的 ID 是由底層資料庫使用自增的方式生成的, 則在調用 save() 方法時, 就會立即發送 INSERT 語句. 

* 因為 save 方法後, 必須保證對象的 ID 是存在的!

*/

commit和flush的差別:flush完下一步是執行一系列的SQL語句,但是沒有送出事務。

commit是先執行flush的操作,然後送出事務,送出事務也就意味着SQL語句更新的資料被同步到資料庫即實作了持久化。

二:

customer表的id是order表的外鍵,通過

@Test

public void testUpdat2(){

Customer customer = (Customer) session.get(Customer.class, 1);

customer.getOrders().iterator().next().setOrderName("GrG"); 

}

@Test

public void testUpdate(){

Order order = (Order) session.get(Order.class, 1);

order.getCustomer().setCustomerName("FFF");

}

發現testUpdate沒有更新資料,而testUpdate2完成了資料更新

三:

refresh(): 會強制發送 SELECT 語句, 以使 Session 緩存中對象的狀态和資料表中對應的記錄保持一緻!

@Test

public void testRefresh(){

News news = (News) session.get(News.class, 1);

System.out.println(news);

session.refresh(news); 

System.out.println(news); 

}

注意mysql資料庫的事務隔離級别預設是可重複讀,應該調用

利用控制台進行mysql的控制

win+r

在指令行裡輸入cmd,進入控制台

輸入

>mysql -uroot -p111111;

>show databases;

>use atguigu;

>selsect * from customer;

>select @@tx_isolation; 

設定目前musql連接配接的隔離級别。

>set transaction isolation level read committed;

設定資料庫系統的全局的隔離級别。

>set globaltransaction isolation level read committed;

設為 讀已送出

四:

clear(): 清理緩存,意味着需要再次送出sql語句,進行commit操作。

@Test

public void testClear(){

News news1 = (News) session.get(News.class, 1);

session.clear();

News news2 = (News) session.get(News.class, 1);

}