Hibernate Notes

什么时候需要重定义equals和hashCode方法(EqualsBuilder,HashCodeBuilder):
    1,特定领域中的逻辑规则;2,Java Collection通过hashCode/equals方法判定两个对象是否相等,set集合中不允许出现重复的元素;3,定义了基于实体类属性的复合主键后,Hibernate要求复合主键类实现equals和hashCode方法,以作为不同数据之间识别的标志。

Hiberante中缓存发挥作用的情况:
1,通过id加载数据时
session.load();和session.iterate();--->类似一个load循环。
2,延迟加载。

一级缓存:
存在于session中由session管理,生命周期同session,采用Map方式实现。key-->id,value-->实体对象。需要通过session加载某个数据对象,session首先会根据锁要加载的数据类和id,在ectitiesByKey中寻找是否已有此数据的缓存实例,如果存在且其状态判定为有效,则以此数据实例作为结果返回。
session.evict();
session.clear();
二级缓存:
生命周期同SessionFactory,同一级缓存实现方式--采用Map方式实现。key-->id,value-->实体对象。-----根据id获得对象的查询。
查询缓存:
专门针对各种查询操作进行缓存。生命周期同SessionFactory,采用Map方式实现。key-->根据查询的语句、查询的条件、查询的参数和查询的页数等信息组成。value分两种方式:(1),使用select语句只查询实体对象的某些列或者某些实体对象列的组合时,value为整个结果集。(2),查询结果为某个实体对象集合时,value为实体对象id集合放到查询缓存中,同时整个结果集放到class缓存(也就是二级缓存),key-->id,value-->pojo对象。

查询方法与缓存:
get():一级缓存--〉查询数据库。
load():一级缓存--〉二级缓存--〉查询数据库。
list():直接运行查询结果所需要的查询语句。(1条SQL语句)。只能使用二级缓存中的查询缓存而无法使用二级缓存对单个对象的缓存。一次获得所有结果集对象并初始化所有的结果集对象。
iterator():先执行得到对象id的查询,再根据每个id值去取所要查询的对象。(可能1+N条SQL语句)。可以充分利用二级缓存,根据id在缓存中检索对象。执行时不会一次初始化所有的对象,而是根据对结果集的访问情况来初始化对象。

你可能感兴趣的:(sql,Hibernate)