1.如果未能发现W合条g的记录,getҎq回nullQ而loadҎ会抛Z个ObejctNotFoundException?br />
2.LoadҎ可返回实体的代理cȝ型,而getҎ永远直接q回实体cR?br />
3.LoadҎ可以充分利用内部~存和二U缓存中现有数据Q而getҎ则仅仅在内部~存中进行数据查找,如没有发现对应数据,越q二U缓存,直接调用SQL完成数据d?
Session.find/iterate的区别:
findҎ执行Select SQL从数据库中获得所有符合条件的记录q构造相应的实体对象Q实体对象构建完毕之后,将其纳入缓存。它对缓存只写不读,因此无法利用~存?br />
iterateҎ首先执行一条Select SQL以获得所有符合查询条件的数据idQ随卻IiterateҎ首先在本地缓存中Ҏid查找对应的实体对象是否存在,如果~存中已l存在对应的数据Q则直接以此数据对象作ؓ查询l果Q如果没有找刎ͼ再执行相应的Select语句获得对应的库表记录(iterateҎ如果执行了数据库d操作q构Z完整的数据对象,也会其查询l果U_~存Q?
Query Cache产生作用的情况:
1.完全相同的Select SQL重复执行?br />
2.在两ơ查询之_此Select SQL对应的库表没有发生过改变?
Session.saveҎ的执行步骤:
1.在Session内部~存中寻扑־保存对象。内部缓存命中,则认为此数据已经保存Q执行过insert操作Q,实体对象已经处于Persistent状态,直接q回?br />
2.如果实体cdClifecycle接口Q则调用待保存对象的onSaveҎ?br />
3.如果实体cdCvalidatable接口Q则调用其validate()Ҏ?br />
4.调用对应拦截器的Interceptor.onSaveҎQ如果有的话Q?br />
5.构造Insert SQLQƈ加以执行?br />
6.记录插入成功Quser.id属性被讑֮为insert操作q回的新记录id倹{?br />
7.user对象攑օ内部~存?br />
8.最后,如果存在U联关系Q对U联关系q行递归处理?
Session.updateҎ的执行步骤:
1.Ҏ待更新实体对象的KeyQ在当前session的内部缓存中q行查找Q如果发玎ͼ则认为当前实体对象已l处于Persistent状态,q回?br />
2.初始化实体对象的状态信息(作ؓ之后脏数据检查的依据Q,q将其纳入内部缓存。注意这里Session.updateҎ本nq没有发送Update SQL完成数据更新操作QUpdate SQL在之后的Session.flushҎ中执行(Transaction.commit在真正提交数据库事务之前会调用Session.flushQ?
Session.saveOrUpdateҎ的执行步骤:
1.首先在Session内部~存中进行查找,如果发现则直接返回?br />
2.执行实体cd应的Interceptor.isUnsavedҎQ如果有的话Q,判断对象是否为未保存状态?br />
3.Ҏunsaved-value判断对象是否处于未保存状态?br />
4.如果对象未保存(Transient状态)Q则调用saveҎ保存对象?br />
5.如果对象为已保存QDetached状态)Q调用updateҎ对象与Session重新兌?/p>

]]>