Hibernate是如何get和load实体的

在下边的一些文章中,我将会围绕着CRUD操作介绍一些概念,这些操作通过Hibernate和数据库进行操作。我们先来讨论一下Hibernate是如何通过load或者get加载实体的。

使用session.load()加载Hibernate实体

Hibernate的session接口为从你的数据库加载实体提供了多种load()方法,每一个load()方法都需要实体的主键作为标识id,是强制提供的,除了ID,Hibernate也需要知道根据id查找的实体或者类的名字。load()方法返回之后,你需要把返回的对象强制转换到相应的类上以便将来使用它,这是load()方法可以正确运行需要的所有的东西。
我们来看一下load()方法在Hibernate session中不同形式
1、public Object load(Class theClass, Serializable id) throws HibernateException
2、public Object load(String entityName, Serializable id) throws HibernateException
3、public void load(Object object, Serializable id) throws HibernateException
第一个load()方法需要类的类型和ID一起加载,第二个方法需要实体的名字和ID,两个方法的都返回你需要的类型的值。最后一个load方法把object作为一个参数,这个对象应该和你要加载的类是一个类的,并且应该为空,Hibernate将会根据你的请求初始化那个对象。其他的load()方法在Hibernate session中也是有效的但要把锁模式作为一个参数。锁模式指定了Hibernate是否需要查询cache和为记录使用数据库那个级别锁。在官方文档中,Hibernate开发者声称Hibernate会为你选择合适的锁模式,尽管在一些情形中手动选择这些锁非常的重要。
当我们把Hibernate基础的知识讲的差不多之后,我们会讨论一些锁的东西
我们看一些简单的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();
   }   
}
 
 
Output:
 
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

现在我们可以通过三种load()方法成功的加载实体,我们现在来看一下get()方法。

使用session.get()方法加载Hibernate实体

get()方法和load()方法非常像,get()方法有一个标识和一个实体名字或者类,有两个get()方法把lock模式作为参数,但是我们稍后讨论锁模式
1、public Object get(Class clazz, Serializable id) throws HibernateException
2、public Object get(String entityName, Serializable id) throws HibernateException
在编码层面上不论是load还是get没有太大的区别,你可以在上边的例子中用get替换load,但是没有get和最后一个load是相等的。你可以修改上边的测试代码的例子。

在Hibernate中load和get的不同

这两种方法的不同在于“ID不存在与数据库中时”的返回值。get方法会得到null,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)

原文地址:http://howtodoinjava.com/2014/09/05/how-to-load-get-entity-in-hibernate/


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值