<b>Hibernate:update和saveOrUpdate详解</b>[Java编程]
本文“<b>Hibernate:update和saveOrUpdate详解</b>[Java编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
先来点概念:
在Hibernate中,最核心的概念就是对PO的状况管理.一个PO有三种状况:
1、未被长期化的VO
此时就是一个内存对象VO,由JVM管理生命周期
2、已被长期化的PO,并且在Session生命周期内
此时映射数据库数据,由数据库管理生命周期
3、曾被长期化过,但目前和Session已经detached了,以VO的身份在运行
这种和Session已经detached的PO还可以进入另一个Session,持续举行PO状况管理,此时它就成为PO的第二种状况了.这种PO实际上是跨了Session举行了状况保护的.
在传统的JDO1.x中,PO只有前面两种状况,一个PO一旦脱离PM,就丧失了状况了,不再和数据库数据关联,成为一个纯粹的内存VO,它即便进入一个新的PM,也不能恢复它的状况了.
Hibernate强的地方就在于,一个PO脱离Session之后,还能保持状况,再进入一个新的Session之后,就恢复状况管理的本领,但此时状况管理需求利用session.update大概session.saveOrUpdate,这就是Hibernate Reference中提到的“requires a slightly different programming model ”
目前正式进入本话题:
简单的来说,update和saveOrUpdate是用来对跨Session的PO举行状况管理的.
假定你的PO不需求跨Session的话,那么就不需求用到,比方你翻开一个Session,对PO举行操作,然后关闭,之后这个PO你也不会再用到了,那么就不需求用update.
因此,我们来看看:
代码
Foo foo=sess.load(Foo.class,id);
foo.setXXX(xxx);
sess.flush();
sess.commit();
PO对象foo的操作都在一个Session生命周期内完成,因此不需求显式的举行sess.update(foo)这样的操作.Hibernate会自动监测到foo对象已经被改正过,因此就向数据库发送一个update的sql.当然假如你非要加上sess.update(foo)也不会错,只不过这样做没有任何必要.
而跨Session的意思就是说这个PO对象在Session关闭之后,你还把它当作一个VO来用,后来你在Session表面又改正了它的属性,然后你又想翻开一个Session,把VO的属性改正保存到数据库里面,那么你就需求用update了.
// in the first session
Cat cat = (Cat) firstSession.load(Cat.class, catId);
Cat potentialMate = new Cat();
firstSession.save(potentialMate);
// in a higher tier of the application
cat.setMate(potentialMate);
// later, in a new session
secondSession.update(cat); // update cat
secondSession.update(mate); // update mate
cat和mate对象是在第一个session中获得的,在第一个session关闭之后,他们就成了PO的第三种状况,和Session已经detached的PO,此时他们的状况信息仍旧被保存下来了.当他们进入第二个session之后,立即便可以举行状况的更新.但是由于对cat的改正操作:cat.setMate(potentialMate); 是在Session表面举行的,Hibernate不大概知道cat对象已经被改过了,第二个Session并不知道这种改正,因此一定要显式的调用secondSession.update(cat); 告诉Hibernate,cat对象已经改正了,你必须发送update的sql了.
所以update的作用就在于此,它只会被用于当一个PO对象跨Session举行状况同步的时刻才需求写.而一个PO对象当它不需求跨Session举行状况管理的时刻,是不需求写update的.
以上是“<b>Hibernate:update和saveOrUpdate详解</b>[Java编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |