hibernate主鍵非native 時flush的影響
阿新 • • 發佈:2019-02-12
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