深入浅出hibernate之PO,VO,load,get

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

深⼊浅出hibernate之PO,VO,load,get
今天⽼师重新详细讲解了hibernate ⾥的POVO.
最开始理解的POVO,感觉就是通过SAVE()⽅法,将OBJ 持久化到数据库.如果要UPDATE,只要将oBJ ⾥属性SET⼀个新值,然后执⾏下UPDATE就好(这是种错误的概念),因为那时还没怎么接触POVO,⼀开始看到这个已经感到很强⼤了,马上就在脑⼦中记住了POVO.
本以为在项⽬中可以得⼼应⼿的利⽤这个好处,结果错误的理解让我出了很多异常:
a different object with the same identifier value was already associated with the session;
上⾯就是其中⼀个,原因是对于POVO的理解错误,引起的,先看下⾯的⼀段代码:
Cat princess = new Cat();//新建⼀个Cat对象
princess.setId("402881830c2cf0f3010c2cf0f8b40001");//将对象set⼀个数据库中已存在的ID
princess.setName("Princess");
princess.setSex('F');
princess.setWeight(18.8f);
Cat princess2 = new Cat();//⼜新建⼀个Cat对象
princess2.setId("402881830c2cf0f3010c2cf0f8b40001");//同时将这个对象也set相同的ID
princess2.setName("Princess");
princess2.setSex('F');
princess2.setWeight(19.8f);
Session session = HibernateSessionFactory.currentSession();//好戏出场了,我们先current a Session
Transaction tx = session.beginTransaction();//开始事物(Transaction到底是什么也不太懂,我只知道它可以将缓存中数据写⼊数据库)
// Cat c = (Cat)session.load(Cat.class, "402881830c2cf0f3010c2cf0f8b40001");
// c.setWeight(20.3f);
session.saveOrUpdate(princess);//此时我们⽤session保存了princess,这之后的princess应该是持久化了,成了PO
session.saveOrUpdate(princess2);//如果按我⼀开始的理解,此时princess2应该也是可以持久化的(看上⾯兰⾊部分),因为princess2只是将princess更新了⽽已(这是致命的错误).
mit();
HibernateSessionFactory.closeSession();
执⾏的结果总是那么讽刺,a different object with the same identifier value was already associated with the session
遇到了问题,总是最让⼈兴奋与⽆奈的时候.还是来看看为什么出错吧:
⾸先来讲讲POVO,PO⼜名persistence object,持久化对象,是指在对象通过save(),update(),load(),get();后,在session的Entity map实体容器⾥将持久话的对象add进去,也就是说,在我session.saveOrUpdate(princess);时,实体容器⾥已经将key和对象加⼊了.因为map是通过不同key来加OBJ的,⽽在hibernate⾥ID是唯⼀标识,使⽤ID来当做key是最好不过的了.因此Session 的实体容器只能加⼊⼀个id的对象.当session.saveOrUpdate(princess2);的时候,session准备把princess2也add到entityMap⾥时,由于相同的id,也就是key,它就报异常了a different object with the same identifier ..恭喜中标.
也就是说PO是在session 的实体容器⾥可引⽤的对象,当我要更新PO时,可以set⼀个属性值,然后只要mit();动作,就可以更新了(让我个⼈感到⾮常惊讶的地⽅).
除了save();之外,同样通过load,update,get也可以获得PO.不过load和get有⼀少许区别(在使⽤的版本3.0中),get(id)就直接把DO获得(马上执⾏select操作),⽽load则不同,它会先对要load的ID做个标记,当要使⽤这个导出的对象时,它再执⾏.⽤上⾯的例⼦:
Cat c = (Cat)session.load(Cat.class, "402881830c2cf0f3010c2cf0f8b40001");//此时只是做标记
c.setWeight(20.3f);//这个时候才真正的执⾏了select 语句.。

相关文档
最新文档