Hibernate中get和load的区别

本文介绍了Hibernate中get和load方法从数据库获取对象的过程,包括取得Session会话、开启事务等步骤。阐述了二者区别,如发生Select sql的时机,get像饿汉模式,load像懒汉模式;返回结果上,get返回实体类对象,load返回代理对象。还说明了获取机制的差异。

Hibernate中get和load主要是用来从数据库中获取对象,
其过程都很简单;主要有3步
1取得Session会话对象
2开启事务
3执行方法
4提交事务

load()

1取得Session会话对象
Session session=HibernateUtil.getCurrentSession();
2开启事务
session.beginTranscation();
3取出User类中值为1的主键
User user=session.load(User.calss,1);
//取出数据表中的用户名id和UserName
System.out.println("userId="+user.getUserId());
System.out.println("userId="+user.getUserName());
4提交事务
session.getTranscation().commit();

过程解析:
1session.load获取user对象,该代理只会保存实体类对象的主键;
4此时的主键已经在代理对象中存在,所以不会发出Select查询
5此时代理对象类中无该值,于是发送select查询

结论:当使用load方法来得到一个对象时,此时hibernate会使用延迟加载的机制来一个代理对象。该代理对象只保存了实体类对象的id(主键字段)。当要使用这个对象,得到其它属性值时,才会发送select sql语句去数据库查询需要的对象。

get:

public void get02(){
	1Session session = HibernateUtil.getCurrentSession();
	2session.beginTransaction();
	3User user = session.get(User.class, 1);//发送select语句,查询值为1的主键
	4System.out.println("userId="+user.getUserId());
	5session.getTransaction().commit();

过程解析:
该方法中,get方法会在第4步执行之前,就会将查询语句发送到数据库进行查询
get与load主要的区别就是:
发生Select sql的时机:就好比单例设计模式中的饿汉和懒汉模式,

{get好比饿汉模式,一加载该类就会立即发送select sql语句从数据库中获取数据
而load好比懒汉模式,等到需要其他属性值时,才会发送select sql语句从数据库总获取数据。}

返回的结果
get方法永远返回查询的实体类对象
load方法返回的是代理对象

最后一点补充:
id//查询的条件,即主键的值
get和load方法都是根据id去获得对应数据的,但是获得机制不同:

简化:确认是否存在---->一级缓存—无---->二级缓存-----无---->数据库中查询----无---->null

简化:确认存在---->一级缓存----无—>Lazy----true—>采用延迟加载策略,当访问到该对象时,再去二级缓存中查询----无---->数据库----无—>抛出异常

详解:
如果使用get方法,hibernate会去确认该id对应的数据是否存在,它首先会去session中去查询(session缓存其实就hibernate的一级缓存),如果没有,再去二级缓存中去查询,如果再没有,就去数据库中查询,仍然没有找到的话,就返回null

load相对get多了一个延迟加载策略,若lazy=false,那么load就和get一样了
而使用load方法的话,hibernate会认定该id对应的数据一定存在,它也会先去session缓存中去查找,如果没有找到,hibernate会根据lazy属性值来确定是否使用延迟加载。如果lazy=‘true’ ,就使用延迟加载,返回该代理对象,等到真正访问到该对象的属性时才会去二级缓存中查询,如果没有,再去数据库中查询,如果还没有,就抛出org.hibernate.ObjectNotFoundException异常。如果lazy=‘false’ 则不使用延迟加载,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值