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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值