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

被折叠的 条评论
为什么被折叠?



