merge
add操作
背景:
Account 和 Group 兩個對象,設置了雙向的many-to-many關係,lazy=true
不使用open session in view 模式
不使用hibernate二級緩存
考慮web應用場景,設置account和group關聯時,只需要group和account的id就夠了。
數據庫中存在兩個group: 1.administrators, 2.engineers
而po對象中,group信息爲:1.invalid, 2.any one
代碼A:
其中,爲po設置了兩個group
輸出結果:
代碼B:
輸出結果:
結論:
1. merge()方法會導致執行查詢group對象的select語句,在調用merge()命令時立即執行(條件:目標group對象沒有被緩存)
2. 無論merger()或save()方法,insert語句都在最後執行,並非在調用相應命令時立即執行
3. 直接調用merge()方法時,會返回一個新的instance,原po保持不變
4. save()之後,po中的group對象並沒有被關聯到session,因此查詢group(id=1)會觸發select語句
5. save()之後,po對象被關聯到session,再次查詢,不會觸發select語句,並且不會檢查group對象是否被關聯到session
6. save()之後再調用merge,返回的是同一個instance,但其關聯group對象會被更新
如果在add一個對象之後,如果存在關聯對象,並且需要再同一個hibernate session中進行回顯,則建議使用merge()方法。
參考:
Hibernate Session.merge() javadoc
open session in view 模式