多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
# Hibernate 获取实体示例 – `get`与`load`方法 > 原文: [https://howtodoinjava.com/hibernate/how-to-load-get-entity-in-hibernate/](https://howtodoinjava.com/hibernate/how-to-load-get-entity-in-hibernate/) 学习使用`session.load()`或`session.get()`方法通过 ID 来获取 **Hiberate 实体**。 了解`get`与`load`方法之间的区别,该方法通过 ID 从数据库中获取实体。 ## 1\. Hiberate 加载实体 – `session.load()` Hibernate 的`Session`接口提供了几种重载的`load()`方法,用于从数据库中加载实体。 每个`load()`方法都需要对象的**主键**作为标识符,并且必须提供该主键。 除了 ID,hibernate 还需要知道使用哪个类或实体名称来查找具有该 ID 的对象。 `load()`方法返回后,我们需要将返回的对象强制转换为合适的类类型,以进一步使用它。 我们需要`load()`方法来正常工作。 #### 1.1 `Session.load()`方法 让我们看看 Hiberate 会话界面中可用的`load()`方法的不同风格。 ```java public Object load(Class theClass, Serializable id) throws HibernateException public Object load(String entityName, Serializable id) throws HibernateException public void load(Object object, Serializable id) throws HibernateException ``` 1. 第一种方法需要您要加载的类类型以及唯一的 ID。 2. 第二种方法直接要求**实体名称**和唯一 ID。 两种方法都将填充的实体对象作为返回值返回,并将其转换为所需的类型。 3. 第三,以对象为参数。 该对象应与要加载的对象属于同一类,并且应为空。 Hibernate 将使用您请求的对象填充该对象。 通过 Hiberate 会话可用的其他`load()`方法也将锁定模式作为参数。 锁定模式指定 Hibernate 是否应调查对象的高速缓存,以及 Hibernate 应对表示该对象的数据行使用哪个数据库锁定级别。 在官方文档中,Hiberate 开发人员声称 *Hibernate 通常会为我们选择正确的锁定模式*,尽管在某些情况下手动选择正确的锁定很重要。 当我们完成基本的 Hiberate 概念时,我们将讨论有关锁的更多信息。 #### 1.2 `Session.load()`方法示例 让我们以最简单的形式看一下每种加载方法的示例,以清楚地了解我们上面所读的内容。 ```java public class TestHibernate { public static void main(String[] args) { Session sessionOne = HibernateUtil.getSessionFactory().openSession(); sessionOne.beginTransaction(); // Create new Employee object EmployeeEntity emp = new EmployeeEntity(); emp.setFirstName("Lokesh"); emp.setLastName("Gupta"); //Save employee sessionOne.save(emp); //store the employee id generated for future use Integer empId = emp.getEmployeeId(); sessionOne.getTransaction().commit(); /************************************************************************/ //Let's open a new session to test load() methods Session sessionTwo = HibernateUtil.getSessionFactory().openSession(); sessionTwo.beginTransaction(); //first load() method example EmployeeEntity emp1 = (EmployeeEntity) sessionTwo.load(EmployeeEntity.class, empId); System.out.println(emp1.getFirstName() + " - " +emp1.getLastName()); //Let's verify the entity name System.out.println(sessionTwo.getEntityName(emp1)); sessionTwo.getTransaction().commit(); /************************************************************************/ Session sessionThree = HibernateUtil.getSessionFactory().openSession(); sessionThree.beginTransaction(); //second load() method example EmployeeEntity emp2 = (EmployeeEntity) sessionThree.load("com.howtodoinjava.demo.entity.EmployeeEntity", empId); System.out.println(emp2.getFirstName() + " - " +emp2.getLastName()); sessionThree.getTransaction().commit(); /************************************************************************/ Session sessionFour = HibernateUtil.getSessionFactory().openSession(); sessionFour.beginTransaction(); //third load() method example EmployeeEntity emp3 = new EmployeeEntity(); sessionFour.load(emp3 , empId); System.out.println(emp3.getFirstName() + " - " +emp3.getLastName()); sessionFour.getTransaction().commit(); HibernateUtil.shutdown(); } } ``` 程序输出。 ```java Hibernate: insert into Employee (FIRST_NAME, LAST_NAME, ID) values (?, ?, ?) Hibernate: select employeeen0_.ID as ID1_1_0_, employeeen0_.FIRST_NAME as FIRST_NA2_1_0_, employeeen0_.LAST_NAME as LAST_NAM3_1_0_ from Employee employeeen0_ where employeeen0_.ID=? Lokesh - Gupta //First load method com.howtodoinjava.demo.entity.EmployeeEntity Hibernate: select employeeen0_.ID as ID1_1_0_, employeeen0_.FIRST_NAME as FIRST_NA2_1_0_, employeeen0_.LAST_NAME as LAST_NAM3_1_0_ from Employee employeeen0_ where employeeen0_.ID=? Lokesh - Gupta //Second load method Hibernate: select employeeen0_.ID as ID1_1_0_, employeeen0_.FIRST_NAME as FIRST_NA2_1_0_, employeeen0_.LAST_NAME as LAST_NAM3_1_0_ from Employee employeeen0_ where employeeen0_.ID=? Lokesh - Gupta //Third load method ``` 因此,我们能够从所有三种加载方法中成功加载实体。 现在转到`get()`方法。 ## 2\. Hiberate 通过 ID 获取实体 – `session.get()` `get()`方法与`load()`方法非常相似。 `get()`方法采用标识符以及实体名称或类。 还有两种`get()`方法以锁定模式作为参数,但是稍后我们将讨论锁定模式。 其余`get()`方法如下: ```java public Object get(Class clazz, Serializable id) throws HibernateException public Object get(String entityName, Serializable id) throws HibernateException ``` 使用`load()`或`get()`方法时代码没有太大差异,您需要做的只是在前两个示例中将`load()`方法替换为`get()`方法。 没有`get()`等同于最后一种`load()`方法。 您可以修改上面的示例并测试代码。 如果您有任何问题,请告诉我。 ## 3\. `load()`和`get()`方法之间的区别 为什么我们有两种方法可以完成相同的工作。 实际上,这也是[面试问题](//howtodoinjava.com/java-interview-questions/ "Java Interview Questions")经常问到的问题。 获取和加载方法之间的**区别在于,当标识符在数据库中不存在时,返回值将返回。** 1. 在`get()`方法的情况下,如果没有标识符,我们将获得返回值`NULL`。 2. 但是在`load()`方法的情况下,我们将获得一个运行时异常。 加载方法的异常如下所示: ```java Exception in thread "main" org.hibernate.ObjectNotFoundException: No row with the given identifier exists: [com.howtodoinjava.demo.entity.EmployeeEntity#23] at org.hibernate.internal.SessionFactoryImpl$1$1.handleEntityNotFound(SessionFactoryImpl.java:253) at org.hibernate.event.internal.DefaultLoadEventListener.load(DefaultLoadEventListener.java:219) at org.hibernate.event.internal.DefaultLoadEventListener.proxyOrLoad(DefaultLoadEventListener.java:275) at org.hibernate.event.internal.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:151) at org.hibernate.internal.SessionImpl.fireLoad(SessionImpl.java:1070) at org.hibernate.internal.SessionImpl.load(SessionImpl.java:940) ``` 这就是本入门级教程的全部内容,讨论了**加载 Hiberate 实体**的过程。 学习愉快!