Identity Map

 
概念
通过在 map中保存所有的加载对象,确保对象只加载一次,每次查找对象都先去map中查找是否有这个对象,如果有就返回,没有才去加载
场景
1、管理从数据库加载的对象,使之持久对象在内存中始终唯一
2、作为从数据库加载对象的缓存器,可以避免每次读数据时候都要从数据库加载
应用
单数据库简单用法:对每个表都有一个对应的 map,当需要从数据库中加载一个对象的时候,你首先核实一下map,如果map中存在一个和你所需要加载的对象相等的一个对象,直接返回这个对象,如果没有,查找数据库,并且把加载出来的对象放到map中。
注意点
1、关键字的选择 :以表名作为map的关键字,以主键作为map中各个对象的关键字
2、 Explicit or Generic:Generic是对每类对象都采用一个方法,比如find("Person", 1),其中一个输入参数制定是什么类型的对象,好处在新增加一个map不需要重新些一个方法。Explicit是对每类对象分别采用不同的方法,比如:findPerson(1),好处比较直观,如果通过泛型来做的,也可以做到新增一个map不用重新一个方法。
3、 map的数量:每类对象对应一个map,如果不同类的每个对象都有一种标识能区别的,可以用次方法,有利于管理map,而且增加一类对象的时候也不需要在家map;整个session对应一个map,比较符合数据库的设计,每个map用表名作为key,比较清晰,但是比较难处理的是继承树的处理。
4 、存放位置:如果存放在 processContext ,必须关注的是必须确保不同 session 只能得到他自己的对象。还有就是对 map 要进行事务性的保护,其中涉及到两个问题,第一个就是尽管你是用关系型数据库来保存数据,但是你必须把加载的数据作为对象放在事务性缓存中,第二个是那些只读对象,因为不需要进行修改,所以可以在整个 processContext 中都可以使用,有种方法是只读对象的 map 放在 processContext 中,可修改对象的 map 放在 session 中。 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值