Hibernate中Session的load()和get()方法
2017-02-19 18:16
387 查看
Session的load()方法和get()方法根据给定的对象id从数据库表中加载一条记录并转换为一个特定的持久类对象。load()方法在没有找到特定的持久类对象所对应的数据库表中的记录时,会抛出ObjectNotFoundException,而get()方法返回null。
(1)load()方法:如果load方法不能再缓存或者数据库中找到对象,会抛出异常;load()方法从不返回null;load()方法返回一个代理类的实例而不是真正的持久实例。代理是一个占位符,当第一次调用他时才装载真正的对象。
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(); }
相关文章推荐
- hibernate中session的load( class,arg)和get( class,arg)方法的区别
- 使用Hibernate时,Session的get()方法和load()方法的区别?
- Hibernate(二)——别被世俗蒙蔽了双眼:Hibernate中Session之get和load方法的真正区别
- 浅谈Hibernate中Session查询时get方法与load方法的区别
- Hibernate中session的get和load方法的区别
- (hibernate之四)session的load方法和get方法
- hibernate 中 session的get 和load方法比较
- [原创]java WEB学习笔记79:Hibernate学习之路--- 四种对象的状态,session核心方法:save()方法,persist()方法,get() 和 load() 方法,update()方法,saveOrUpdate() 方法,merge() 方法,delete() 方法,evict(),hibernate 调用存储过程,hibernate 与 触发器协同工作
- hibernate--session的CRUD方法, delete, load,get,update,saveorupdate, clear, flush
- hibernate中session的get()、load()方法比较
- Hibernate中的JUnit和session中的get和load方法
- 框架学习之Hibernate 第三节 session接口以及get/load/persist方法
- Hibernate session.get()和session.load()方法的区别
- Hibernate中Session.get()方法和load()方法的详细比较
- 一口一口吃掉Hibernate(二)——别被世俗蒙蔽了双眼:Hibernate中Session之get和load方法的真正区别
- hibernate中session的get()、load()方法比较
- hibernate中session的get()、load()方法比较
- hibernate中session的get跟load方法的比较【转载】
- Hibernate深入理解----03Session缓存核心方法(save()和persist(),get()和load(),update()和saveOrUpdate,delete()和evil()
- hibernate中session的load和get方法