hibernate之数据加载---Session.get/load
Session.get/load()都是根据指定的实体类和id从数据库中读取记录,并返回与之对应的实体对象;
其区别:
- 如果在数据库里未发现所要查询的值,get()返回Null,而load()抛出ObjectNullFoundException异常;
- Load()方法可以返回实体的代理类实例,而get()永远直接返回实体类;
- Load()可以利用内部缓存和二级缓存的数据,而get()只在内部缓存中查找,如果没有则发出SQL去执行查询;
看一个最简单的数据加载:
TUser user = (TUser) session.load(TUser.class, new Integer(1));
session加载实体对象时,将经过哪些过程?
- 处于性能的考虑,Session在调用数据库查询功能之前,会先在缓存中查询,首先会根据实体类和id在内部缓存中查找;如果有值则返回它;
- 然后,Session会在当前"NonExists"记录中进行查找,如果“NonExists”记录中在同样的查询条件,则返回null;("NonExists"记录了当前session实例在之前所查询操作中,未能查到有效的数据查询条件[相当于一个黑名单查询列表],如此以来,如果session中一个无效的查询条件重复出现,即可迅速作出判断,获得更高性能);
- 对于Load()而言,如果内部缓存没有想要的值,那么继续在二级缓存中查询,如果有,则返回它;
- 如果在缓存中没能发现值,则发出SQL去执行查询操作,经过查询未发现对应记录,则将此次查询的信息记录到"NonExists";并返回null;
- 根据映射配置和SQL得到的ResultSet,创建对应的数据对象;
- 将其数据对象纳入当前Session实体管理容器(内部缓存)中;
- 执行Interceptor.onLoad方法(如果有对应的Interceptor);
- 将数据对象纳入二级缓存;
- 如果数据对象实现了lifeCycle接口,则调用数据对象的onLoad方法;
- 返回数据对象;
相关推荐
solarspot 2020-07-28
houmenghu 2020-11-17
我心似明月 2020-11-09
oraclemch 2020-11-06
ltd00 2020-09-12
康慧欣 2020-09-10
waveclouds 2020-09-04
蓝色深海 2020-09-15
jincheng 2020-09-01
思君夜未眠 2020-08-25
取个好名字真难 2020-08-06
歆萌 2020-08-03
阳光之吻 2020-08-03
婷婷小屋 2020-07-28
MLXY 2020-07-26
dxbjfu0 2020-07-26
songbinxu 2020-07-19
83520298 2020-07-06