hiberbate的get和load的区别
首先要明确:hiberbate的get和load方法是由Session接口提供的,是用来获取实体对象的。
java代码:
--get加载方法: Users user = (Users)session.get(Users.class, userId);
--load加载方法:Users user = (Users)session.load(Users.class,userId)
加载方式:
--get为立即加载(执行时,会立即向数据库发出sql语句),不支持延迟加载
--load为延迟加载(返回值是只有一个id属性的代理,只有使用该对象的时候才会发出sql语句),支持延迟加载
返回结果:
--get检索不到数据时,返回为null
--load没有读取到数据则会抛ObjectNotFoundException异常
注:
get方法会确认数据是否存在,也就是立即查询,执行顺序是先从session缓存中查,然后还会去二级缓存中查,最后去数据库查,如果都没有,返回NULL;
load方法加载数据会先确认lazy属性的配置(默认为true):
1、若为true会先检查session缓存,如果不存在,则启动/使用 延迟加载,返回实体的代理类对象(动态生成的),等到具体使用该对象的时候,再去查询二级缓存和数据库,这时候,如果没有符合条件的数据,则抛出异常;
2、若为false,查询方式就会和get的查询方式是一样的,只是在最后数据库中没有相应数据时是抛异常,
由此可见,如果是load方法的话,跑出异常是说明使用数据时,数据库中没有数据。
趁着年轻,好好修行!