Hibernate Session get()vs load()的区别

Hibernate Session提供了从数据库中获取数据的不同方法。其中两个是 - get()load()。我们还可以在不同的情况下使用很多重载方法。

首先看两者get()并且load()看起来相似,因为它们都从数据库中获取数据,但它们之间几乎没有差别,让我们用一个简单的例子来看一下它们。


package com.journaldev.hibernate.main;import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;import com.journaldev.hibernate.model.Employee;
import com.journaldev.hibernate.util.HibernateUtil;public class HibernateGetVsLoad {public static void main(String[] args) {//Prep WorkSessionFactory sessionFactory = HibernateUtil.getSessionFactory();Session session = sessionFactory.openSession();Transaction tx = session.beginTransaction();//Get ExampleEmployee emp = (Employee) session.get(Employee.class, new Long(2));System.out.println("Employee get called");System.out.println("Employee ID= "+emp.getId());System.out.println("Employee Get Details:: "+emp+"\n");//load ExampleEmployee emp1 = (Employee) session.load(Employee.class, new Long(1));System.out.println("Employee load called");System.out.println("Employee ID= "+emp1.getId());System.out.println("Employee load Details:: "+emp1+"\n");//Close resourcestx.commit();sessionFactory.close();}
}

当我执行上面的代码时,它会产生以下输出。


Hibernate: select employee0_.emp_id as emp_id1_1_0_, employee0_.emp_name as emp_name2_1_0_, employee0_.emp_salary as emp_sala3_1_0_, address1_.emp_id as emp_id1_0_1_, address1_.address_line1 as address_2_0_1_, address1_.city as city3_0_1_, address1_.zipcode as zipcode4_0_1_ from EMPLOYEE employee0_ left outer join ADDRESS address1_ on employee0_.emp_id=address1_.emp_id where employee0_.emp_id=?
Employee get called
Employee ID= 2
Employee Get Details:: Id= 2, Name= David, Salary= 200.0, {Address= AddressLine1= Arques Ave, City=Santa Clara, Zipcode=95051}Employee load called
Employee ID= 1
Hibernate: select employee0_.emp_id as emp_id1_1_0_, employee0_.emp_name as emp_name2_1_0_, employee0_.emp_salary as emp_sala3_1_0_, address1_.emp_id as emp_id1_0_1_, address1_.address_line1 as address_2_0_1_, address1_.city as city3_0_1_, address1_.zipcode as zipcode4_0_1_ from EMPLOYEE employee0_ left outer join ADDRESS address1_ on employee0_.emp_id=address1_.emp_id where employee0_.emp_id=?
Employee load Details:: Id= 1, Name= Pankaj, Salary= 100.0, {Address= AddressLine1= Albany Dr, City=San Jose, Zipcode=95129}

从输出中可以清楚地看到,get()通过从数据库或从hibernate缓存中获取对象来返回对象,而load()只返回可能实际不存在的对象的引用,只有在访问对象的其他属性时才从数据库或缓存中加载数据。

现在让我们尝试获取数据库中不存在的数据。


//Get Example
try{
Employee emp = (Employee) session.get(Employee.class, new Long(200));
System.out.println("Employee get called");
if(emp != null){
System.out.println("Employee GET ID= "+emp.getId());
System.out.println("Employee Get Details:: "+emp+"\n");
}
}catch(Exception e){e.printStackTrace();
}//load Example
try{
Employee emp1 = (Employee) session.load(Employee.class, new Long(100));
System.out.println("Employee load called");
System.out.println("Employee LOAD ID= "+emp1.getId());
System.out.println("Employee load Details:: "+emp1+"\n");
}catch(Exception e){e.printStackTrace();
}

上面的代码产生以下输出。


Hibernate: select employee0_.emp_id as emp_id1_1_0_, employee0_.emp_name as emp_name2_1_0_, employee0_.emp_salary as emp_sala3_1_0_, address1_.emp_id as emp_id1_0_1_, address1_.address_line1 as address_2_0_1_, address1_.city as city3_0_1_, address1_.zipcode as zipcode4_0_1_ from EMPLOYEE employee0_ left outer join ADDRESS address1_ on employee0_.emp_id=address1_.emp_id where employee0_.emp_id=?
Employee get called
Employee load called
Employee LOAD ID= 100
Hibernate: select employee0_.emp_id as emp_id1_1_0_, employee0_.emp_name as emp_name2_1_0_, employee0_.emp_salary as emp_sala3_1_0_, address1_.emp_id as emp_id1_0_1_, address1_.address_line1 as address_2_0_1_, address1_.city as city3_0_1_, address1_.zipcode as zipcode4_0_1_ from EMPLOYEE employee0_ left outer join ADDRESS address1_ on employee0_.emp_id=address1_.emp_id where employee0_.emp_id=?
org.hibernate.ObjectNotFoundException: No row with the given identifier exists: [com.journaldev.hibernate.model.Employee#100]at org.hibernate.internal.SessionFactoryImpl$1$1.handleEntityNotFound(SessionFactoryImpl.java:253)at org.hibernate.proxy.AbstractLazyInitializer.checkTargetState(AbstractLazyInitializer.java:262)at org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:176)at org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:286)at org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer.invoke(JavassistLazyInitializer.java:185)at com.journaldev.hibernate.model.Employee_$$_jvst407_1.toString(Employee_$$_jvst407_1.java)at java.lang.String.valueOf(String.java:2847)at java.lang.StringBuilder.append(StringBuilder.java:128)at com.journaldev.hibernate.main.HibernateExample.main(HibernateExample.java:36)

仔细查看输出,当我们get()用来检索不存在的数据时,它返回null。这是有道理的,因为它试图在调用数据后立即加载数据。

有了load(),我们可以打印id,但是一旦我们尝试访问其他字段,它就会触发数据库查询并org.hibernate.ObjectNotFoundException在没有找到给定标识符的记录时抛出。它是特定于hibernate的运行时异常,所以我们不需要明确地捕获它。

我们来看看一些重载方法。上面的get()和load()方法也可以编写如下。


Employee emp = (Employee) session.get("com.journaldev.hibernate.model.Employee", new Long(2));Employee emp1 = (Employee) session.load("com.journaldev.hibernate.model.Employee", new Long(1));Employee emp2 = new Employee();
session.load(emp1, new Long(1));

还有其他方法有LockOptions参数,但我没有使用它们。请注意,我们需要传递完整的类名作为参数。

基于以上解释,我们在get()和load()之间存在以下差异:

  1. get()一旦调用数据就加载数据,而load()返回代理对象并仅在实际需要时加载数据,因此load()它更好,因为它支持延迟加载。
  2. 由于load()在找不到数据时抛出异常,我们应该只在知道数据存在时才使用它。
  3. get()当我们想要确保数据库中存在数据时,我们应该使用它们。

这就是hibernate get和load方法的全部内容,我希望它能解决一些疑问并帮助您决定在不同场景中使用哪一个。

转载来源:https://www.journaldev.com/3472/hibernate-session-get-vs-load-difference-with-examples

Hibernate Session get()vs load()的区别相关推荐

  1. hibernate延迟加载(get和load的区别)

    在hibernate中我们知道如果要从数据库中得到一个对象,通常有两种方式,一种是通过session.get()方法,另一种就是通过session.load()方法,然后其实这两种方法在获得一个实体对 ...

  2. hibernate延迟加载(get和load的区别)(转)

    在hibernate中我们知道如果要从数据库中得到一个对象,通常有两种方式,一种是通过session.get()方法,另一种就是通过session.load()方法,然后其实这两种方法在获得一个实体对 ...

  3. Hibernate Session get()vs load()实例差异

    Hibernate Session provide different methods to fetch data from database. Two of them are – get() and ...

  4. Hibernate save, saveOrUpdate, persist, merge, update 区别

    Hibernate save, saveOrUpdate, persist, merge, update 区别 - 小黑客 - 博客园 https://www.cnblogs.com/xiaoheik ...

  5. Hibernate Session merge,update,save,saveOrUpdate,persist

    Hibernate Session merge,update,save,saveOrUpdate,persist Hibernate Session是java应用程序和hibernate框架之间的接口 ...

  6. Hibernate Session合并,更新,保存,saveOrUpdate,持久化示例

    Hibernate Session is the interface between java application and hibernate framework. Today we will l ...

  7. Hibernate Session的delete()方法

    本文介绍Hibernate Session的delete()方法.delete()方法用于从数据库中删除与Java对象对应的记录.对应游离对象和持久化对象,delete语句会做出不同的反应. dele ...

  8. Could not open Hibernate Session for transaction;

    javax.servlet.ServletException: org.springframework.transaction.CannotCreateTransactionException: Co ...

  9. ready与load的区别

    JQuery里有ready和load事件 $(document).ready(function() {// ...代码... }) //document ready 简写 $(function() { ...

最新文章

  1. 【学术前沿】26 亿参数训练量,水平接近人类,Google 开发的“史上最强”聊天机器人意义何在?...
  2. 成都Uber优步司机奖励政策(2月1日)
  3. 开源大数据周刊-第49期
  4. JavaScript 对象中this的指向问题
  5. android view 源码分析,Android ViewPager源码详细分析
  6. 一些很特别的J2ME开源项目
  7. 设计模式之动态代理的代码实现(Java)
  8. OpenCV自动跟踪移动目标DaSiamRPN的实例(附完整代码)
  9. Mockito详细介绍
  10. 电子设计大赛-AD与DA电路设计
  11. 从后端到页面:如何全方位监控 Ruby 应用?
  12. 2021暗月web渗透测试攻防全栈红队视频教程网络安全程师ctf学习
  13. html语言制作表格模板,十个最简单实用的Table设计模板
  14. 《幸福人生 从心开始》讲座参后感
  15. 微信小程序开发实战 ⑤(API及多人协调开发)
  16. 企业级市场“两马战”:云计算将成重要战场
  17. 计算两个日期之间的工作日(去掉周末和节假日)
  18. 第十五次ScrumMeeting博客
  19. 实用的多人配音教学,轻松为视频配音
  20. todolist(网页版记事本)

热门文章

  1. Google Maps API V3: 通过邮编获取经纬度 Get Location (Latitude and Longitude) from Zip Cod
  2. jQuery实现的向下推送图文信息滚动效果
  3. magento:getChildHtml() 与getChildChildHtml() 的用法,区别
  4. Write a simple HTML Browser(hdu1088)
  5. 【转载】JAVA的泛型和C++的模板的区别与联系
  6. 《Python数据分析常用手册》NumPy和Pandas
  7. 《剑指Offer》 矩形覆盖
  8. k8s—centos7安装部署NFS服务器和客户端及基于nfs的动态存储storageclass使用总结
  9. MySQL——Caused by: java.sql.SQLException: Unknown system variable ‘transaction_isolation‘
  10. python-函数-局部变量与全局变量