一、多对多 在对象中如何表达多对多关系: 两方都使用集合表达。即两个对象中互相持有对方的集合的引用。 小结: <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元素