Hibernate 3 关系映射
映射文件配置
//one-to-many映射文件配置
<set name = "少的一方的属性名" cascade=“save-update”>
<key colume="多的一方的属性名"></key>
<one-to-many class="多的一方的类全路径"/>
</set>
//many-to-one映射文件的配置
<many-to-one name="多的一方的属性" cascade="" class="少的一方的类全路径名" colume="少的一方的属性名"/>
一对多相关操作
-
级联操作是指当主控方执行保存、更新或者删除操作时,被关联对象也执行相同的操作
-
映射文件cascade设置
- save-update:保存或更新操作
-
A关联了B,B关联了C和D(假设都是对应的insert语句)
- 执行save(A),四条insert语句
- 执行save(B),三条
- 执行save(C),一条,因为没有关联谁,只有被关联的关系
-
级联删除
- JDBC中,有外键的话,是不可以进行删除操作的
- Hibernate可以删除,但不会删除被关联的另一方,而是将被关联对象的外键设为null
- cascade设置可以使得两方同时被删除
- delete:在删除时同时删除两方
-
双向关联产生多余的SQL语句
- 缓冲区和快照区数据不一致可能导致执行两次update语句
- 解决方法
- 通常让多的一方进行维护,而少的一方放弃维护权
- inverse=“true”:表示放弃维护权,配置在少的一方
-
cascade和inverse的区别
- cascade强调的是操作一个对象的时候,是否操作其关联对象
- inverse强调的是外键的维护权
- 如:
- customer配置了cascade和inverse
- customer A关联了B
- save(A)时,会自动进行save(B)操作,这是cascade起作用
- 而存储进数据库的B没有外键,这是inverse起作用
多(A)对多(B)
- 新建一张表C,表的两项对应A和B的主键
- 映射文件配置
<set name="属性名" table="C">
<key column="C的一项,如user_id"/>
<many-to-many class="关联的另一方B的全路径" column="c的主键"/>
</set>
- 核心配置文件加入映射文件
<mapping resource="A的映射文件"/>
<mapping resource="C的映射文件"/>
- 如果进行双向维护,即两方都配置了映射文件,那么需要一方放弃维护权
- 多对多操作
- 级联保存保存或更新或删除
- 与一对多相同,使用cascade,参数值为save-update,delete
- 级联保存保存或更新或删除