一、继承关系映射
1. 整个继承树一张表
父类用普通的<class>标签定义。
父类通过<discriminator>标签来指定鉴别器。放置<id>标签的后面
如:<discriminator column="字段名" type="string"/>
子类使用<subclass>标签(嵌套在<class>标签内)定义:
subclass标签的name属性是子类的全限定名。
在subclass标签中,用discriminator-value属性来标明本子类的discriminator字段的值。
子类的其它属性,像普通类一样,定义在subclass标签的内部。
2. 每个子类一张表
父类用普通的<class>标签定义即可,父类不再需要定义discriminator字段
子类用<joined-subclass>标签定义:
需要包含一个<key>标签,用来指定子类和父类之间是通过哪个字段来关联的:
如:<key column="s_id"/>
子类的其它属性,像普通属性一样,定义在joined-subclass标签的内部。
<class name="com.qiujy.domain.Singer">
<id name="id">
<generator class="native"/>
</id>
<property name="name"/>
<property name="region"/>
<property name="description"/>
<joined-subclass name="com.qiujy.domain.SingleSinger">
<key column="single_id"/>
<property name="gender" column="single_gender"/>
</joined-subclass>
<joined-subclass name="com.qiujy.domain.Bands">
<key column="bands_id"/>
<property name="leader" column="bands_leader"/>
</joined-subclass>
</class>
3. 每个具体类一张表
父类用普通<class>标签定义即可。(如果父类为抽象类,可以添加abstract="true"来禁止产生表)
注意:主键生成策略不能使用自增生成主键。可以使用uuid。因为在保存对象的时候id是不能重复的。
子类用<union-subclass>标签定义:
union-subclass标签不再需要包含key标签(与joined-subclass不同)
子类的其它属性,像普通类一样,定义在union-subclass标签的内部。这里只要定义子类的属性,
因为它继承了父类,在映射到数据库表的时候,它会包含上父类的所有属性的映射字段。
<class name="com.qiujy.domain.Singer" abstract="true">
<id name="id">
<generator class="uuid"/>
</id>
<property name="name"/>
<property name="region"/>
<property name="description"/>
<union-subclass name="com.qiujy.domain.SingleSinger">
<property name="gender" column="single_gender"/>
</union-subclass>
<union-subclass name="com.qiujy.domain.Bands">
<property name="leader" column="bands_leader"/>
</union-subclass>
</class>
4. 策略选择
如果不需要多态查询:使用“每个具体类一张表”。
一定要使用多态查询:
子类中的属性相对较少,使用“整个继承树一张表”。
子类中的属性较多,使用“每个子类一张表”。
简单的问题一般选择“整个继承树一张表”,复杂案例一般选择“每个子类一张表”。
二. 组件映射: <component name="组件类的全限定名"></component>
三. 复合主键
通常将复合主键相关的属性,单独放到一个类中
此类必须实现序列化接口
覆写hashcode和equals方法
<composite-id name="复合主键属性名" class="全限定名"></composite-id>