`

hibernate get() load() 方法区别

阅读更多

get和load区别

1.get()采用立即加载方式,返回的是有实体数据的对象,而load()采用延迟加载,返回的是代理对象
   a.get方法首先查询session缓存(一级缓存),如果该对象被代理过,返回代理对象,没有被代理过,
  返回实体类对象,在一级缓存里没有数据,就会查询二级缓存,最后查询数据库,是立即发出sql语句
  
   b.load方法也是首先查询session缓存(一级缓存),没有找到则创建代理类(注意此时不发出sql,也不  

  会报错,只是创建了代理对象),当使用时user时查找二级缓存,没有则查询数据库,此时才发出sql      

  语句

2.如果数据库中没有对应的记录,通过get方法加载,返回的是null;而通过load加载,当使用user时

  (如user.getName())会抛出异常:ObjectNotFoundException;

@Test
	public void testGetLoad() {
		Session session = sessionFactory.getCurrentSession();
		session.beginTransaction();
		/*
		 *load返回的类型是代理对象,
		 *get返回的类型是返回有实体数据的对象,即
		 *1.该对象被代理过,返回代理对象
		 *2.该对象没有被代理过,返回实体类对象 
		 */
		//session缓存中没有id为6的对象
		User u1 = (User) session.load(User.class, 6);//不发sql语句,用到时才发出sql语句
		System.out.println(u1.getClass());//输出结果:class com.test.pojo.User_$$_javassist_0
		System.out.println(u1.getName());//此时用到u1对象发sql语句,若数据库中有记录,则输出,若无则抛出异常:ObjectNotFoundException
		
		/*
		 * session缓存中id为6的对象被代理过,输出结果是代理对象
		 */
		User u2 = (User) session.get(User.class, 6);//不发sql语句,因为此时session缓存有(上面已load此id为6的对象)
		System.out.println(u2.getClass());//输出结果:class com.test.pojo.User_$$_javassist_0
		System.out.println(u2.getName());//输出session缓存的数据
		
		User u3 = (User) session.load(User.class, 7);//不发sql语句
		System.out.println(u1.getClass());//输出结果:class com.test.pojo.User_$$_javassist_0
		
		User u4 = (User) session.get(User.class, 7);//立即发sql语句(此对象缓存没有数据)
		System.out.println(u4.getClass());//输出结果:class com.test.pojo.User_$$_javassist_0
		System.out.println(u4.getName());//输出查询的数据
		
		//session缓存中id为7的对象没有被代理过,输出的结果是实例类对象
		User u5 = (User) session.get(User.class, 8);//立即发sql语句
		System.out.println(u5.getClass());//输出结果:class com.test.pojo.User
		session.getTransaction().commit();
		
	}

结果:

 

class com.test.pojo.User_$$_javassist_0
Hibernate: select user0_.id as id1_1_0_, user0_.age as age2_1_0_, user0_.name as name3_1_0_ from User user0_ where user0_.id=?
zhangsan
class com.test.pojo.User_$$_javassist_0
zhangsan
class com.test.pojo.User_$$_javassist_0
Hibernate: select user0_.id as id1_1_0_, user0_.age as age2_1_0_, user0_.name as name3_1_0_ from User user0_ where user0_.id=?
class com.test.pojo.User_$$_javassist_0
zhangsan
Hibernate: select user0_.id as id1_1_0_, user0_.age as age2_1_0_, user0_.name as name3_1_0_ from User user0_ where user0_.id=?
class com.test.pojo.User

 

分享到:
评论

相关推荐

    hibernate get load区别

    get方法首先查询session缓存,没有的话查询二级缓存,最后查询数据库;反而load方法创建时首先查询session缓存,没有就创建代理,实际使用数据时才查询二级缓存和数据库

    hibernate中get和load方法的区别

    NULL 博文链接:https://ysj5125094.iteye.com/blog/1897557

    Hibernate的get和load方法的区别

    NULL 博文链接:https://811417208-qq-com.iteye.com/blog/506950

    Hibernate中get和load方法的区别以及close(),clear()、evict()等的区别

    Hibernate Session中的 flush方法的作用 get和load方式是根据id取得一个记录 下边详细说一下get和load的不同,因为有些时候为了对比也会把find加进来。 1.从返回结果上对比: load方式检索不到的话会抛出org....

    hibernate中get和load的区别共5页.pdf

    hibernate中get和load的区别共5页.pdf.zip

    Hibernate查询 load与get的区别及其它查询测试

    NULL 博文链接:https://quicker.iteye.com/blog/658451

    hibernate 三种 查询 方式 load与get的区别

    NULL 博文链接:https://cici9898-007.iteye.com/blog/1847710

    Hibernate中load方法与get方法的区别

    Hibernate中有两个极为相似的方法get()与load(),他们都可以通过指定的实体类与ID从数据库中读取数据,并返回对应的实例,但Hibernate不会搞两个完全一样的方法的

    hibernate get/load/saveOrUpdate/statistics

    博文链接:https://log-cd.iteye.com/blog/205166

    Hibernate中get()和load()的区别.docx

    Hibernate中根据Id单条查询获取对象的方式有两种,分别是get()和load(),来看一下这两种方式的区别。 1. get() 使用get()来根据ID进行单条查询: User user=session.get(User.class, "1"); 当get()方法被调用的时候...

    Hibernate中Session.get()方法和load()方法的详细比较

    今天小编就为大家分享一篇关于Hibernate中Session.get()方法和load()方法的详细比较,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧

    Hibernate学习笔记

    Hibernate 学习笔记 get和load的区别 一对一,一对多,多对多 悲观锁,乐观锁 hibernate查询语言hql hibernate一级缓存、二级缓存 抓取策略

    Hibernate入门文档

    Hibernate 难点解析: hibernate中uuid和...Hibernate get与load的区别 hibernate二级缓存中list和iterator的用法 Hibernate中的对象有三种状态: lock和update区别 save 和update区别 update 和saveOrUpdate区别

    hibernate操作数据库笔记

    //该方法将到classpath下解析hibernate.cfg.xml中的配置,如果不用Hibernate默认的配置文件名和路径,可在该方法中指定Hibernate配置文件的名称和路径 2.用Configuration对象获取SessionFactory和Session对象:...

    hibernate基础教程

    1、get()方法 2、load()方法 3、批量存储:session.flush()和session.clear() 二 Hibernate中的二级缓存结构 在Hibernate中使用两极缓存结构,第一...

    传智播客李勇hibernate源码1-20课

    04_Session接口及get|load|persist方法 05_实体对象的三种状态与saveOrUpdate方法 06_完善HibernateUtil类及hql查询入门 07_实体类或属性名与数据库关键字冲突问题 10_使用Hibernate完成CRUD实验的步骤说明 11_...

    hibernate查询与缓存

    Hibernate查询首先介绍get()和load()方法的区别:get()方法和load()方法的区别主要在于对二级缓存的使用上。load()方法会使用二级缓存,而get()方法在一级缓存没有找到会直接查询数据库,不会去二级缓存中查找。 get...

Global site tag (gtag.js) - Google Analytics