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方法的话,跑出异常是说明使用数据时,数据库中没有数据。

 

posted @ 2017-06-13 17:16  大漠鬼手--禹文轩  阅读(218)  评论(0编辑  收藏  举报