实体类关系如图所示:
映射到数据库中:
1.单独一张表(鉴别器)。如图
配置文件写法:
<class name="Employee" table="employee"discriminator-value="0">
<id column="id" name="id">
<generator class="native" />
</id>
<discriminator column="type" type="int" />
<property name="name" />
<subclass name="Skiller" discriminator-value="1">
<property name="skill" />
</subclass>
<subclass name="Sales" discriminator-value="2">
<property name="sell" />
</subclass>
</class>
说明:discriminator :鉴别器,默认type是string。
subclass :子类
总结:这种形式查询速度快,但数据库表结构不合理,表中有很多空的字段值。特别是子类特有的属性很多的时候。
2.父类和子类各映射一张表(内连接),如图。
配置文件写法:
<class name="Employee" table="employee">
<id column="id" name="id">
<generator class="native" />
</id>
<property name="name" />
<joined-subclass name="Skiller" table="skiller">
<key column="emp_id"/>
<property name="skill"/>
</joined-subclass>
<joined-subclass name="Sales" table="sales">
<key column="emp_id"/>
<property name="sell"/>
</joined-subclass>
</class>
总结:这种形式数据库表结构合理,但增删改查的速度都较慢,性能不好。
注意:查询是最好注明子类类名(get(Sales.class , id) ),不要用多态查询( get(Employee.class , id) ),不然性能会很差
3.鉴别器与内连接结合。
配置文件写法:
<class name="Employee" table="employee"discriminator-value="0">
<id column="id" name="id">
<generator class="native" />
</id>
<discriminator column="type" type="int" />
<property name="name" />
<subclass name="Skiller" discriminator-value="1">
<property name="skill" />
</subclass>
<subclass name="Sales" discriminator-value="2">
<join table="sales">
<key column="emp_id"/>
<property name="sell" />
</join>
</subclass>
</class>
总结:这种形式一般是在Sales类特有的属性很多,Skiller特有属性少的时候用。
4.每个具体类映射一张独立表。
配置文件写法:
<!-- 父类:Employee,采用每个具体类一张表的方式(抽象类不对应表) -->
<class name="Employee" table="employee">
<id column="id" name="id">
<!-- 这时不能使用identity生成策略,因为要求整个继承结构中所有的数据记录的id不能重复。
因为下面是union-subclass -->
<generator class="hilo" />
</id>
<property name="name" />
<union-subclass name="Skiller" table="skiller">
<property name="skill" />
</union-subclass>
<union-subclass name="Sales" table="sales">
<property name="sell"/>
</union-subclass>
</class>
若父类为抽象类,则将父类Class配置(第一句)写成:
<class name="Employee" table="employee" abstract="true">
总结:这种形式 增删改 的速度都很好,但 查询 时较慢。