Hibernate学习笔记 merge()方法--add对象
2009-01-19 15:30
387 查看
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 模式
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:
Account account = (Account) getHibernateTemplate().merge(po); Long id = account.getId(); System.out.println("/tGet obj after added in dao start ..."); Account readAccount = (Account) getHibernateTemplate().get( Account.class, id); System.out.println("/tGet obj after added in dao end ..."); System.out.println("/tIs po==readAccount ? " + (po == readAccount)); System.out.println("/tShow detai of po: " + po.toDetailString()); System.out.println("/tShow detai of readAccount: " + readAccount.toDetailString());
其中,为po设置了两个group
输出结果:
Hibernate: select ... from SYS_GROUPS where ID=? Hibernate: select ... from SYS_GROUPS where ID=? Get obj after added in dao start ... Get obj after added in dao end ... Is po==readAccount ? false Show detai of po: Account[0.account_22, groups[2.any one 1.invalid ]] Show detai of readAccount: Account[22.account_22, groups[2.engineers 1.administrators ]] Hibernate: insert into SYS_ACCOUNTS (...) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) Hibernate: insert into SYS_GROUP_MEMBER (ACCOUNT_ID, GROUP_ID) values (?, ?) Hibernate: insert into SYS_GROUP_MEMBER (ACCOUNT_ID, GROUP_ID) values (?, ?)
代码B:
Long id = (Long) getHibernateTemplate().save(po); System.out.println("/tGet obj after added in dao start ..."); Group group = (Group)getHibernateTemplate().get(Group.class,new Long(1)); System.out.println("/tGroup detai:" + group.toString()); Account readAccount = (Account) getHibernateTemplate().get( Account.class, id); System.out.println("/tGet obj after added in dao end ..."); System.out.println("/tIs po==readAccount ? " + (po == readAccount)); System.out.println("/tShow detai of po: " + po.toDetailString()); System.out.println("/tShow detai of readAccount: " + readAccount.toDetailString()); getHibernateTemplate().merge(readAccount); Account readAgain = (Account) getHibernateTemplate().get(Account.class, id); System.out.println("/tIs po==readAgain ? " + (readAgain == po)); System.out.println("/tIs readAgain== readAccount? " + (readAgain == readAccount)); System.out.println("/tShow detai again: " + readAgain.toDetailString());
输出结果:
Get obj after added in dao start ... Hibernate: select ... from SYS_GROUPS where ID=? Group detai:Group 1. administrators Get obj after added in dao end ... Is po==readAccount ? true Show detai of po: Account[27.account_27, groups[1.invalid 2.any one ]] Show detai of readAccount: Account[27.account_27, groups[1.invalid 2.any one ]] Hibernate: select ... from SYS_GROUPS where ID=? Is po==readAgain ? true Is readAgain== readAccount? true Show detai again: Account[27.account_27, groups[1.administrators 2.engineers ]] Hibernate: insert into SYS_ACCOUNTS (...) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) Hibernate: insert into SYS_GROUP_MEMBER (ACCOUNT_ID, GROUP_ID) values (?, ?) Hibernate: insert into SYS_GROUP_MEMBER (ACCOUNT_ID, GROUP_ID) values (?, ?)
结论:
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 模式
相关文章推荐
- [原创]java WEB学习笔记79:Hibernate学习之路--- 四种对象的状态,session核心方法:save()方法,persist()方法,get() 和 load() 方法,update()方法,saveOrUpdate() 方法,merge() 方法,delete() 方法,evict(),hibernate 调用存储过程,hibernate 与 触发器协同工作
- Hibernate学习笔记 merge()方法--update 之补充
- 【学习笔记】Hibernate中对象的状态和转换以及Session的主要方法总结
- Hibernate学习笔记(四)----核心开发接口、对象的三种状态、session常用方法
- Hibernate学习笔记之Session-API实现CRUD以及get&load&merge方法
- Hibernate学习笔记 merge()方法--update对象
- Hibernate学习笔记---通过load和get方法来查询对象(只能根据主键来查询)
- JavaWeb学习笔记-Hibernate-05-实体对象与数据库关键词冲突解决方法
- Hibernate学习笔记 -- day10 OID、对象导航查询、原生SQL
- java学习笔记5——对象以及包,类和方法
- 黑马程序员-IOS学习笔记 OC 关于对象方法类方法的一些概念
- 31天重构学习笔记13. 提取方法对象
- 对象建模方法与技术学习笔记(一)
- 前端学习笔记汇总(之merge方法)
- JAVA学习笔记3--类,对象,变量,方法,构造方法,this,引用类型
- 黑马程序员 - 学习笔记2 对象 类 方法 属性
- 【Java学习笔记】String对象的不变性和intern()方法——基于Java SE8
- Hibernate学习-13:操作持久化对象的方法
- 巴巴运动网学习笔记三之产品分类实体对象基本属性的JPA映射,用泛型技术对产品分类的业务管理Bean抽象,单元测试产品分类的业务管理Bean.,重载业务管理Bean的删除方法,