6、主键生成器:
1 increment :先执行select max(id)获取主键最大值,然后再+1执行insert 使用于 oracle,mysql,sqlserver等数据库。
2 foreign :使用情况:1:1 共享主键。 3 sequence : (oracle postgre db2) 调用数据库底层sequence 进行主键的生成; 默认调用:hibernate_sequence <generator class="sequence"> <param name="sequence">xxxx</param> </generator>

4 identity : (MySQL,SQLServer 2000 3个驱动, 2005 1个驱动) 适用范围:见表的时候 指定主键自增关键字的数据库 create table xxx( id int auto_increment primary key, name varchar(12), ); 5 native :根据连接数据库的不同,在sequence 和 identity进行选择通过方言区分所 连接的数据库。 6 assgined :手工分配主键生成器,让应用程序在save()之前为对象分配一个标示符。

7 hilo :高低位算法主键生成器; 高位值 和 低位值 --> 算法 --> 主键生成; 高位值:来自于程序员在数据库中,自己定义的一张当行单列的表里面的值。 低位值: 程序员在主键生成器任意指定的数字。 注意: 每生成一个新主键都会为高位置+1 <generator class="hilo"> <param name="table">t_suns</param> <param name="column">value</param> <param name="max_lo">3</param> </generator> 8 uuid :全球唯一128字符串,充当主键。 9 select :通过trigger (触发器)生成主键。

7、Hibernate高级特性:
1 延缓提交,注意事项: A 查询没有延缓提交; B session.flush(); 立即提交数据。 实现原理:JDBC中的批量处理。 2 脏数据检查 (dirty check): 脏数据:对象中存储的数据和对应的数据库中存储的数据不一致,那么对象中存储的数据就是脏数据。 脏数据检查:hibernate一旦在事务提交的时候,发现脏数据的产生,自动更新数据库 中的数据。 好处:方便操作。 实现原理: 发现脏数据,session内部存储一个一模一样的t; Teacher t = (Teacher)session.get(Teacher.class,9); t.setName("suns"); tx.commit(); //当前的t与session中的t作比较。 session.get(Student.class,9) 怎么在Session中存储备份的对象(一模一样的t):public class Session{ Map<{9,Student.class},s> Map<{9,Teacher.class},t> ……}

- 9 -
由于本人知识水平有限,总结的笔记中倘若有错误的地方,欢迎联系我批评指证;Email:tengbx@tarena.com.cn
3 hibernate缓存体系(cache): a.session缓存概念: 当用户调用 save(xx) update(xx) get(xx) Query hibernate会把用户所在上述方法中操作的数据,保存在session内部,当用户下一次进行查询时,hibernate首先到session内部查询数据,如果发现有合适数据直接返回给用户,如果没有则查询数据库。 好处:减少数据库通信,提高系统的查询效率。 实现原理:session存储一个Map<key,对象>。 注意问题 : 1 利用hibernate缓存,必须明确以主键为条件进行查询。 2 list iterator A)list() 会执行一条sql语句,iterate()会执行n+1次sql语句,n所查询对象的个数,1为查询所有PK。 B)list(不能利用session缓存),iterator(利用session缓存)

例如hql: Query query = session.createQuery(); List<xxx> ret = query.list(); Query query = session.createQuery(); Iterator it = qurey.iterate();

3 清空session缓存: session.close(); session.clear(); session.evict(Object ); b. hibernate缓存体系: 一级缓存,Session缓存;
二级缓存,SessionFactory缓存。 SessionFactory缓存实现: 二级缓存额外的配置(缓存框架): 搭建环境:添加ehcache.jar ehcache.xml放置在src根目录下。 开发配置步骤: 1 hibernate.cfg.xml 配置 2级缓存

<property name="cache.provider_class">org.hibernate.cache.EhCacheProvider</property> <!—配置query执行的Hql语句二级缓存--> <property name="cache.use_query_cache">true</property>

<class name="Dept" table="t_dept"> <cache usage="read-only"/> …. </class> <!-- 一对多中关系属性set集合也要进行缓存配置 --> <set lazy="false" inverse="true" name="employees" cascade="save-update"> <cache usage="read-only"/>

<key column="d_id"/> <one-to-many class="Employee"/> </set>

3 hibernate.cfg.xml配置需要缓存的数据(与xxx.hbm.xml中任选其一即可): <!-- 普通实体类的二级缓存配置 --> <class-cache class="day3.Employee" usage="read-only"/> <!-- 关系属性集合的二级缓存配置 --> <collection-cache collection="day3.Dept.employees" usage="read-only"/>
3 查询缓存: 用于缓存相同参数值的HQL语句及结果,基于二级缓存使用,启用过程: a.在hibernate.cfg.xml中启用查询缓存; <property name="cache.use_query_cache">true</property> b.在执行query.list()之前,调用query.setCacheable(true); setCacheable(true)的而两个作用: i. 从二级缓存(查询缓存)中取数据,如果取不到,去数据库中查; ii. 把从数据库中查出来的数据放入二级缓存(查询缓存)。