一对多表的映射编写的配置文件
编写映射的配置文件
* 在多的一方:
<many-to-one name="customer" class="cn.itcast.hibernate.demo4.Customer" column="cno"/>
* 在一的一方:
<set name="orders">
<key column="cno"/>
<one-to-many class="cn.itcast.hibernate.demo4.Order"/>
</set>
一对多表的级联保存(
cascade="save-update"
)
级联保存效果
* 级联保存:保存一方同时可以把关联的对象也保存到数据库中!!
* 例如:现在只保存客户,那么默认订单也会保存到数据库中。
* 注意:现在保存的是客户,所以需要在客户的映射文件中来加一个配置
* <set name="orders" cascade="save-update">
* 例如:保存订单,同时想级联客户的信息(即保存订单,也把客户信息保存到数据库中)
* 注意:现在保存的订单,所以需要在订单的映射文件中添加一个配置
* <many-to-one cascade="save-update" name="customer" class="cn.itcast.demo1.Customer" column="cno"/>
一对多表的级联删除(
cascade="save-update,delete"
)
* 注意:如果使用级联删除时,不能使用托管状态对象的方式删除,手动创建的客户,客户下没有关联订单,所以订单不能删除。
* 删除客户的时候,同时删除关联的订单
* 注意1:先查询客户,再来删除客户,同时通过级联删除,会把该客户下所有的订单全部删除掉
* 注意2:现在操作的是删除客户,所以需要在Customer.hbm.xml的配置文件中的<set>标签上添加cascade属性,值为delete
* <set name="orders" cascade="save-update,delete"> 出现多个值,使用逗号隔开即可。
* 删除订单的时候,同时删除关联的客户(不常用,但是可以删除)
* 删除订单的同时,级联删除客户。
* 注意1:是在操作订单,所以需要在Order.hbm.xml的配置文件中<many-to-one>标签上添加cascade属性,即
* <many-to-one cascade="save-update,delete" />
一对多表的孤儿删除(注意只有一对多表中有孤儿删除)
孤儿删除(孤子删除)
* 在一对多的关系中,可以将一的一方认为是父方.将多的一方认为是子方.孤儿删除:在解除了父子关系的时候.将子方记录就直接删除。
* 通俗的理解:如果配置了孤儿删除,再把订单的外键设置成null的同时,这条订单的记录也会同时删除掉!
* 设置孤儿删除
* 在Customer.hbm.xml中配置:<set name="orders" cascade="save-update,delete,delete-orphan">
* 注意:演示的时候把Order.hbm.xml中<many-to-one cascade="save-update,delete" /> delete去掉,要不会产生级联删除。
级联的取值(cascade的取值)
* none -- 不使用级联
* save-update -- 级联保存或更新.
* delete -- 级联删除.
* delete-orphan -- 孤儿删除.(注意:只能应用在一对多关系)
* all -- 除了delete-orphan的所有情况.(包含save-update delete)
* all-delete-orphan -- 包含了delete-orphan的所有情况.(包含save-update delete delete-orphan)
放弃外键的维护:
.如果不想产生多余的SQL语句,那么需要一方来放弃外键的维护!
* 一般都是一的一方来放弃外键的维护!
* 在<set>标签上配置一个inverse=”true”.true:放弃.false:不放弃.默认值是false
=============================================================================
多对多表的映射文件的配置
配置多对多的映射
* 先使用<set>标签描述集合,注意:必须要提供table属性,指的是中间表的名称。
* 再配置<key>标签,column属性代表当前对象在中间表的外键名称。
* 再配置<many-to-many>标签,class属性是集合中对象的全路径,column代表的是集合中对象在中间表的外键名称。
* Student.hbm.xml
<set name="courses" table="stu_cour">
<!-- 当前对象在中间表的外键的名称. -->
<key column="sno"/>
<!-- 配置many-to-many -->
<many-to-many class="cn.itcast.hibernate.demo5.Course" column="cno"/>
</set>
* Course.hbm.xml
<!-- 配置学生的集合 -->
<set name="students" table="stu_cour">
<key column="cno"></key>
<many-to-many class="cn.itcast.hibernate.demo5.Student" column="sno"/>
</set>
* 多对多进行双向关联的时候:必须有一方去放弃外键维护权.