单向一对多
实体配置:在一的实体中设置多的一方SET集合
配置文件:在一的一方用set 设置 one to many
表配置:多方表的外键指向一方表的主键;
双向一对多
实体配置:在一的实体中设置多的一方SET集合,在多的一方的实体中配置一的一方的属性
配置文件:在一的一方用set 设置 one to many,对多的一方设置many-to-one
表配置:多方表的外键指向一方表的主键;
让某一方放弃外键的维护,为多对多映射做准备: inverse
在修改客户和联系人的关系时,进行双向关联,双方都会维护外键,会产生多余的 SQL 语句.
产生的原因: session 的一级缓存中的快照机制,会让双方都更新数据库,产生了多余的 SQL 语句.
如果不想产生多余的 SQL 语句,那么需要一方来放弃外键的维护, 由多方来维护!
// 放弃外键维护
// Customer.hbm.xml 进行如下配置
<set name="linkman" inverse="true"> // true 表示放弃; 默认值为 false
<key column="lkm_cust_id"/>
<one-to-many class="com.itheima.domain.Linkman"/>
</set>
多对多映射
实体配置:双方都有Set集合
配置文件: 在多的一方配置另一个多的一方,需要中间表 // 配置多对多
// name 表示集合的名称
// table 表示中间表的名称
<set name="roles" table="sys_user_role" inverse="true">
// 当前对象在中间表的外键名称
<key column="user_id"/>
// class : 集合中存入的对象,对象的全路径
// column: 集合中对象,在中间表的外键名称
<many-to-many class="com.itheima.domain.Role" column="role_id"/>
</set>
表配置:需要中间表,中间表的外键指向两个表的主键;
单向一对一主键关联
实体配置:配置被控制端的实体
配置文件:需要在控制端配置被控制端,
主键生成策略 因为主键跟外键是同一个,所以直接在这里申明该主键就是外键,并且指向了被控制端这个类
<!--由于在申明主键的时候已经将关系写清楚了,所以在这里没有column这个属性。按平常的习惯,我们会在这里写上column="数据库中外键字段属性名称。"-->
<!--constrained属性:就是表明我们的主键当外键使用了。 这个属性两个作用,一是通知这种对应关系在上面已经写过了,所以这里才不需要写column,二是表明这种关系是什么,也就是主键当外键。
其实还有一个级联关系的作用,这里不做多说明,具体会在这章之后一起讲解,不然会让人感觉很混乱。-->
<one-to-one name="idCard" constrained="true"></one-to-one>
双向一对一主键关联
实体配置:在控制端配置被控制端的实体,在被控端配置控制端的实体
配置文件:需要在控制端配置被控制端,
主键生成策略 因为主键跟外键是同一个,所以直接在这里申明该主键就是外键,并且指向了被控制端这个类
<!--由于在申明主键的时候已经将关系写清楚了,所以在这里没有column这个属性。按平常的习惯,我们会在这里写上column="数据库中外键字段属性名称。"-->
<!--constrained属性:就是表明我们的主键当外键使用了。 这个属性两个作用,一是通知这种对应关系在上面已经写过了,所以这里才不需要写column,二是表明这种关系是什么,也就是主键当外键。
其实还有一个级联关系的作用,这里不做多说明,具体会在这章之后一起讲解,不然会让人感觉很混乱。-->
<one-to-one name="idCard" constrained="true"></one-to-one>
被控制端配置: <one-to-one name="person"></one-to-one>
单向一对一外键关联 多对一的一个特例
实体配置:在被看做多的一端配置另一端的一个实体
配置文件:在被看做多的一端配置
<!--跟多对一一样,只是增加了一个unique属性。这样就指定了这端为一了。-->
<many-to-one name="idCard" column="cardId" unique=true></many-to-one>