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 模式