在Hibernate中:
如果你使用load方法,hibernate认为该id对应的对象(数据库记录)在数据库中是一定存在的,所 以它可以放心的使用,它可以放心的使用代理来延迟加载该对象。在用到对象中的其他属性数据时才查询数据库,但是万一数据库中不存在该记录,那没办法,只能抛异常
ObjectNotFoundException。
下面是使用load查询对象的时候,对象不存在的情况下的Hibernate处理机制。
- public void testQuertNotExistByLoadMethod(){
- Session session = null;
- Transaction tran = null;
- Person p =null;
- try{
- session = FactorySession.getSession();
- tran = session.beginTransaction();
- tran.begin();
- //使用了lazy,只有在正真使用的时候才加载数据对象
- //Hibernate延迟加载采用的是代理方式
- p=(Person)session.load(Person.class, "不存在");
- System.out.println(p.getPerName());
- session.save(p);
- tran.commit();
- } catch (Exception e) {
- tran.rollback();
- } finally {
- FactorySession.closeSession(session);
- }
- }
下面是调试情况下的截图:
使用load加载数据的时候,这里的id="不存在"在数据库中并不存在数据,将会抛出异常。
当使用get方法的时候当查询的数据数据库不存在的时候将返回null.
下面是通过查询数据库已有的数据,然后修改持久化数据,查看代理类的状态。
- public void testQuertNotExist(){
- Session session = null;
- Transaction tran = null;
- Person p =null;
- try{
- session = FactorySession.getSession();
- tran = session.beginTransaction();
- tran.begin();
- //采用load方法,获得已有的对象,然后进行更新
- p=(Person)session.load(Person.class, "8aab8c8538a101310138a10132190001");
- System.out.println(p.toString());
- p.setCreatTime(new Date());
- session.save(p);
- tran.commit();
- } catch (Exception e) {
- tran.rollback();
- } finally {
- FactorySession.closeSession(session);
- }
- }
Person类的对象p是存在的,当程序运行到 System.out.println(p.toString()); 的时候控制台输出
- Hibernate: select person0_.perId as perId0_0_, person0_.perNamee as perNamee0_0_, person0_.creatTime as creatTime0_0_ from ext.dbo.Person person0_ where person0_.perId=?
- Person [creatTime=2012-07-20 06:14:21.173, perId=8aab8c8538a101310138a10132190001, perName=孙悟空]
查看运行过程的代理类的信息:
- Hibernate: select person0_.perId as perId0_0_, person0_.perNamee as perNamee0_0_, person0_.creatTime as creatTime0_0_ from ext.dbo.Person person0_ where person0_.perId=?
- Person [creatTime=2012-07-20 06:15:58.167, perId=8aab8c8538a101310138a10132190001, perName=孙悟空]
- Hibernate: update ext.dbo.Person set perNamee=?, creatTime=? where perId=?
get和load的根本区别:hibernate对于load方法认为该数据在数据库中一定存在,可以放心的使用代理来延迟加载,如果在使用过程中发现了问题,就抛异常;而对于get方法,hibernate一定要获取到真实的数据,否则返回null。load方法具有延迟加载的功能,而get方法没有。
本文转自 secondriver 51CTO博客,原文链接:http://blog.51cto.com/aiilive/935844,如需转载请自行联系原作者