1. 程式人生 > >hibernate主鍵非native 時flush的影響

hibernate主鍵非native 時flush的影響

hibernate的主鍵生成策略常用的有三種,uuid,native,和assigned三種,三種不同的配置方式對資料庫傳送sql語句的時機也有略微的不同,下面進行以下總結:

資料庫我們採用的是mysql,隔離級別為讀已提交

我們關注的主要是session中的existsInDatabase屬性

1:uuid

save: existsInDatabase=false

flush: existsInDatabase=true

2:native

save: existsInDatabase=true

3:assigned

save: existsInDatabase=false

flush: existsInDatabase

=true

結論:uuid和assigned由於都不是資料庫生成的主鍵,所以會在執行flush的時候執行刷出鏡像資料,執行sql語句

而native會在執行save的時候執行sql語句原因是生成主鍵的時候需要資料庫的支援,那麼會產生的現象就是,策略

不是native時我們執行save後再evict,將會出現異常在session的insertions集合中取出物件進行insert操作後
需要更新entityEntries屬性中的existsInDatabase為true,而我們採用evict已經將物件從session的entityEntries

中逐出了,所以找不到相關資料,無法更新,丟擲異常。並且會發現,flush的時候sql語句的執行順序是insert

update,delete 並不是按照我們程式碼的順序

所以,當主鍵生成策略為非native時,為了避免不必要的麻煩記得及時的flush