在下边的一些文章中,我将会围绕着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/