hibernate里load方法和get方法的区别

本文通过实验对比了Hibernate中load与get方法的区别。load方法在Session中查找缓存对象,若不存在则创建代理对象,访问属性时才会查询数据库。get方法则总是查询数据库并返回结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

关键字: hibernate load get 区别

网上有许多关于load和get方法的讨论,自己做了一个小小的实验,明确一下load和get方法的工作原理。
首先get方法没有什么可说的,就是在Session执行此函数的时候hit一下数据库,而load方法比较麻烦,具体的执行流程是这样的:
java 代码
  1. Sessionsession=getSessionFactory().openSession();
  2. Transactiontr=session.beginTransaction();
  3. //Studentstu2=(Student)session.get(Student.class,newInteger(5));
  4. //if(session.contains(stu2))System.out.println("stu2inthesession");
  5. Studentstu=(Student)session.load(Student.class,newInteger(5));
  6. stu.getAddress();
  7. tr.commit();
  8. session.close();

(1)查找Session所在的persistent Context中是否有缓存的persistent object,如果有则直接返回该persistent object作为stu对象;如果没有,则需要建立代理对象,该代理对象不是我们认为的pojo,其中的代理对象的initialized属性为false,target属性为null。
(2)在访问获得的代理对象的属性时,例如执行stu.getArress()时,因为此时的persistent Context中没有该persistent object,所以会hit数据库。
(3)hit数据库时,如果在数据库中找到该对象对应的记录,那么用获得的对象赋值给该代理对象的target属性,并且将initialized属性改为true;如果在数据库中找不到该对象对应的记录,那么抛出org.hibernate.ObjectNotFoundException异常。

而get方法每次执行都hit数据库,如果没有相对应的记录,那么就返回null。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值