# 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 实体**的过程。

学习愉快！