Hibernate中Session的load()和get()方法

2/22/2017来源:ASP.NET技巧人气:4693

session的load()方法和get()方法根据给定的对象id从数据库表中加载一条记录并转换为一个特定的持久类对象。load()方法在没有找到特定的持久类对象所对应的数据库表中的记录时,会抛出ObjectNotFoundException,而get()方法返回null。

get()方法和load()方法返回的对象位于Session的缓存中,因此党对他的属性进行修改后,Session清理缓存时,会根据持久化对象的属性来同步更新数据库。 load()和get()方法的区别:

(1)load()方法:如果load方法不能再缓存或者数据库中找到对象,会抛出异常;load()方法从不返回null;load()方法返回一个代理类的实例而不是真正的持久实例。代理是一个占位符,当第一次调用他时才装载真正的对象。

(2)get()方法:如果没有找到对象返回null,另一方面,get()方法从不返回代理类而是直接返回实体类。load()方法可以充分利用内部缓存和二级缓存中的现有数据,而get()方法仅仅在内部缓存中进行数据查找,如果没有发现对应的数据,将越过二级缓存,直接调用SQL完成数据读取。 该如何选择load()方法和get()方法: (1)load()方法应用在对象存在的情况下加载 (2)利用get()方法可以首先判断对象是否存在,然后在获得它。 /** * 测试load方法 * 一旦加载了持久化实例之后,在代码中对持久化实例所做的修改,将会被保存到数据库中。 * 程序对持久化实例所做的修改会在session flush之前被自动保存到数据库中, * 无需程序调用其他方法(不需要调用update方法)。也就是说修改对象的最简单方法就是在session处于打开状态时load它, * 然后直接修改即可。这种方法有一个极大的性能缺陷:当需要修改某条记录的时候,这种做法会产生两条sql语句: * 一条用于查询指定记录,一条用于修改该记录。 */ public static void testLoad(){ Configuration cfg = new Configuration().configure(); SessionFactory factory = cfg.buildSessionFactory(); Session session = factory.openSession(); Transaction transaction = session.beginTransaction(); Company company = (Company) session.load(Company.class, 1); System.out.PRintln(company.getShortName()); company.setShortName("总公司"); transaction.commit(); session.close(); System.out.println(company.getShortName()); } /** * 测试get方法 */ public static void testGet(){ Configuration cfg = new Configuration().configure(); SessionFactory factory = cfg.buildSessionFactory(); Session session = factory.openSession(); Transaction transaction = session.beginTransaction(); Company company = (Company) session.get(Company.class, 1); System.out.println(company.getShortName()); company.setShortName("总厂"); transaction.commit(); session.close(); System.out.println(company.getShortName()); } /** * 测试load与get方法在数据库中没有匹配记录时的反应 * 该程序的输出为:get方法返回值为null。原因: * 如果没有匹配的数据库记录,load方法可能抛出异常HibernateException;如果在类映射文件中指定延迟加载, * 则load方法会返回一个未初始化的代理对象,这个代理对象并没有装载数据库对象,直到程序调用该代理对象的某方法时, * hibernate才访问数据库。默认情况下为延迟加载 * get方法立即访问数据库,如果没有对应的记录,get方法返回null * 两者的主要区别在是否延迟加载。 */ public static void testLoadAndGet(){ Configuration cfg = new Configuration().configure(); SessionFactory factory = cfg.buildSessionFactory(); Session session = factory.openSession(); Transaction transaction = session.beginTransaction(); Company company = (Company) session.get(Company.class, 11); if(company == null){ System.out.println("get方法返回值为null"); } Company company1 = (Company)session.load(Company.class, 11); if(company1 == null){ System.out.println("load方法返回值为null"); } transaction.commit(); session.close(); }