收藏 分享(赏)

session中merge和update的区别.doc

上传人:myk79025 文档编号:7651964 上传时间:2019-05-23 格式:DOC 页数:3 大小:86KB
下载 相关 举报
session中merge和update的区别.doc_第1页
第1页 / 共3页
session中merge和update的区别.doc_第2页
第2页 / 共3页
session中merge和update的区别.doc_第3页
第3页 / 共3页
亲,该文档总共3页,全部预览完了,如果喜欢就下载吧!
资源描述

1、session 的 update 与 merge 方法标签: 杂谈Hibernate 的 merge 方法,按照 hibernate 对象生命周期的三个状态来讲。1:如果 POJO 对象处于游离态,我所说的游离态是指该对象的 id 值为空。hibernate 判断一个对象在数据库中是否存在不是看对象的其他信息,而是判断该 id 在数据库中是不是存在。如果 id 为空,那自然是不存在,所以当我们调用 merge 方法的时候,就会直接执行插入操作。这一点有点像 saveorupdate()方法。看一段代码:Java 代码 User user = new User(); /user.setId(4)

2、; user.setUsername(“heyuanling2“); user.setAge(23); user.setSex(“w“); user.setPassword(“heyuanling“); Session session = this.getSession(); Transaction tr = session.beginTransaction(); /User exituser = (User)session.get(User.class, new Integer(1); session.merge(user); mit(); 再看 hibernate 的 sql 语句:Jav

3、a 代码 Hibernate: select max(id) from user_ Hibernate: insert into user_ (username, password, sex, age, birthday, other, id) values (?, ?, ?, ?, ?, ?, ?) 二:脱管态:如果我们把上面代码里/user.setId(4);的注释去掉,那么它就变成了脱管的对象了(其实从游离到脱管就这么简单,没有官方说的那么邪乎.)。这是我们再来看控制台的 sql 打印:Java 代码 Hibernate: select user0_.id as id4_0_, user

4、0_.username as username4_0_, user0_.password as password4_0_, user0_.sex as sex4_0_, user0_.age as age4_0_, user0_.birthday as birthday4_0_, user0_.other as other4_0_ from user_ user0_ where user0_.id=? 看到没有,因为 id 不为空了,所以 hibernate 就不会再 insert 了。由于该对象的信息和数据库里的一模一样,所以 hibernate 只执行了一个 select 语句,并没有 u

5、pdate,如果我们把字段的值做稍微的变动,那么控制台打印的 sql 语句还应该有一条 update 语句。就这一点来说,merge 还有和 saveorupdate()方法一样。三:持久态:持久态更好理解。如果我们从数据库里 get 一条记录,那么这条记录就处于持久态,如果再调用 merge,那么 hibernate 就会先判断该记录是否被修改,没有则什么也不干,修改了就 update。这一点还是和 saveorupdate()有点像。Java 代码 Session session = this.getSession(); Transaction tr = session.beginTran

6、saction(); User exituser = (User)session.get(User.class, new Integer(1); exituser.setAge(11); session.merge(exituser); mit(); session.close(); 再看控制台打印结果:Java 代码 Hibernate: select user0_.id as id4_0_, user0_.username as username4_0_, user0_.password as password4_0_, user0_.sex as sex4_0_, user0_.age

7、as age4_0_, user0_.birthday as birthday4_0_, user0_.other as other4_0_ from user_ user0_ where user0_.id=? Hibernate: update user_ set username=?, password=?, sex=?, age=?, birthday=?, other=? where id=? 如果没有对记录进行修改则不会有后面的那条 update 语句。那么 merge 和 saveorupdate()到底有什么区别呢?看一段代码:Java 代码 Session session =

8、 this.getSession(); Transaction tr = session.beginTransaction(); User exituser = (User)session.get(User.class, new Integer(1); mit(); session.close(); session = getSession(); tr = session.beginTransaction(); User exituser2 = (User)session.get(User.class, new Integer(1); session.update(exituser); mit

9、(); session.close(); 运行上面的代码,hibernate 给我们报了一个错误:a different object with the same identifier value was already associated with the session。意思是,在 session 缓存中以两个标识相同的对象,这是不可以的。那么,吧 update 改成 merge 会怎么样呢?改为 merge 后,一切 OK,运行正常。其实 merge 在执行更新之前会将两个标识符相同的对象进行合并,具体合并的方向是向 exituser2合并。注意:merge 方法在执行之前都回去缓存中找是不是有相应的记录,也就是会有一条select 语句,执行改语句的目的是为了判断该对象是否被修改了。而 update 就不管这些,直接就一条 update 语句。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报