一、多对多
在对象中如何表达多对多关系:
两方都使用集合表达。即两个对象中互相持有对方的集合的引用。
小结:
<set name="本方引用的集合名称" table="中间表表名" >
<key column="本方中间表列名称" />
<many-to-many class="对方的完整类名" column="对方中间表列名称" />
</set>
操作:
inverse:本方是否要放弃维护外键关系(默认值是false)
cascade:是否需要级联操作(有5个值)(没有默认值)
save-update 级联保存和级联修改
delete 级联删除
delete-orphan 孤儿删除
all save-update + delete
all-delete-orphan save-update + delete + delete-orphan
二、检索策略
1、类级别
load方法 => 受class元素上的lazy属性影响
2、关联级别
1> 一对多:根据客户去找订单
fetch:
select (默认值) 使用普通select语句查询集合内容
join 使用表连接语句查询集合
subselect 同时加载多个对象的集合时,使用子查询语句
lazy:
true (默认值)需要使用时才会去加载
false 立即加载
extra 极其懒惰,当调用集合的size时,Hibernate只会发送count语句
小结:
使用join时,lazy属性失效,都是立即加载。
使用select时,lazy属性正常。
使用subselect,除了在加载多个集合时使用子查询语句外,其他同select。
2> 多对一:根据订单去找客户
fetch:
select (默认值) 使用普通select语句查询集合内容
join 使用表连接语句查询集合
lazy:
false 立即加载
proxy 交给对方的类加载策略决定,受class元素上的lazy属性影响
3、批量检索
batch-size="n" 决定一次加载几个对象(客户)的集合数据
三、查询总结
1、get/load 根据oid进行检索
2、对象导航图检索
3、Sql语句查询
4、Hql语句查询
5、Criteria查询(了解)
四、连接池、事务、锁
c3p0连接池
1、导包,c3p0-0.9.1.jar 在 Hibernate 的类库中optional文件夹下
2、在hibernate.cfg.xml 进行配置
3、配置c3p0中的具体使用的参数
事务
隔离级别设置: hibernate.connection.isolation 1 2 4 8
锁
悲观锁
读锁:select * from xxx lock in share mode; => get(clazz, id, LockOption.READ);
写锁:select * from xxx for update; => get(clazz, id, LockOption.UPGRADE);
乐观锁
1、实体类中加入版本控制属性(类型是Integer)
2、在Xxx.hbm.xml,配置上version元素