Hibernate 获取实体示例 – get与load方法

Hibernate 获取实体示例 – getload方法

原文: https://howtodoinjava.com/hibernate/how-to-load-get-entity-in-hibernate/

学习使用session.load()session.get()方法通过 ID 来获取 Hiberate 实体。 了解getload方法之间的区别,该方法通过 ID 从数据库中获取实体。

1. Hiberate 加载实体 – session.load()

Hibernate 的Session接口提供了几种重载的load()方法,用于从数据库中加载实体。 每个load()方法都需要对象的主键作为标识符,并且必须提供该主键。

除了 ID,hibernate 还需要知道使用哪个类或实体名称来查找具有该 ID 的对象。 load()方法返回后,我们需要将返回的对象强制转换为合适的类类型,以进一步使用它。 我们需要load()方法来正常工作。

1.1 Session.load()方法

让我们看看 Hiberate 会话界面中可用的load()方法的不同风格。

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()方法示例

让我们以最简单的形式看一下每种加载方法的示例,以清楚地了解我们上面所读的内容。

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();
   }    
}

程序输出。

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()方法如下:

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()方法之间的区别

为什么我们有两种方法可以完成相同的工作。 实际上,这也是面试问题经常问到的问题。

获取和加载方法之间的区别在于,当标识符在数据库中不存在时,返回值将返回。

  1. get()方法的情况下,如果没有标识符,我们将获得返回值NULL
  2. 但是在load()方法的情况下,我们将获得一个运行时异常。

加载方法的异常如下所示:

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

学习愉快!