继承的映射实现以及说明
方式一:一个类继承体系一张表
整个继承体系就用一张表。设计一张表employee
idname depart_id type skill sell
0 表示普通员工 1 技术员 2 销售员
type-------鉴别器
<classname="Employee" table="employee"discriminator-value="0">
<idname="id" column="id">
<generatorclass="native"/>
</id>
<discriminatorcolumn="type" type="int" />
<propertyname="name" column="name"/>
<many-to-onename="depart" column="depart_id"foreign-key="id"/>
<subclassname="Skiller" discriminator-value="1">
<propertyname="skill" />
</subclass>
<subclassname="Sales" discriminator-value="2">
<propertyname="sell" />
</subclass>
</class>
查询的时候,它支持多态的查询,当使用子类的class反射当参数的时候,它查询的时候没带上type的值
discriminator-value 是鉴别器的值为多少的时候,则代表一种情况。
好处:使用一张表,在做查询的时候效率高
弊端:字段为空。如果子类的变量扩展的多的情况,则表中会有很多的null值
方式二:每个子类一张表。存放子类的所特有的属性,在映射文件中书写的格式为:
<classname="Employee" table="employee">
<idname="id">
<generatorclass="native"></generator>
</id>
<propertyname="name" column="name" />
<many-to-onename="depart" column="depart_id"foreign-key="id"/>
<joined-subclassname="Skiller" table="skiller">
<keycolumn="employee_id" />
<propertyname="skill" />
</joined-subclass>
<joined-subclassname="Sales" table="sales">
<keycolumn="employee_id"/>
<propertyname="sell"/>
</joined-subclass>
</class>
共有三张表 employee skiller sales
查询的时候,可以使用多态,也可以使用指定的子类去查询,
Employeeemp=(Employee) session.get(Skiller.class, 2);
System.out.println(emp.getName()+emp.getClass());
if(empinstanceof Skiller){
System.out.println(((Skiller)emp).getSkill());
}
好处:表格设计的合理,没有大量null值
弊端,当在做查询的时候,使用的是表连接来查询,如果子类多了,查询的效率不高,影响运行的速度等问题
方式三:混合使用 "一个类继承体系一张表" 和 "每个子类一张表"(表结构)
解决子类特有属性比较多的时候,可以结合使用 xml映射文件如下(将sales单独创建一个表):
<classname="Employee" table="employee"discriminator-value="0">
<idname="id">
<generatorclass="native"/>
</id>
<discriminatorcolumn="type" type="int"></discriminator>
<propertyname="name" column="name"/>
<many-to-onename="depart" column="depart_id" />
<subclassname="Skiller" discriminator-value="1">
<propertyname="skill"/>
</subclass>
<subclassname="Sales" discriminator-value="2">
<jointable="sales">
<keycolumn="employee_id"/>
<propertyname="sell"/>
</join>
</subclass>
</class>
好处:可以适当的解决效率的问题和设计表格的问题,选用的时候,可以将复杂的子类或者是子类的特有属性比较多的时候,可以
将此子类新建一张表。如果字段少,则可加入在父类对应的表的字段中。
方式四:每个具体类一张完成的表 (表结构)
<classname="Employee" table="employee">
<idname="id">
<generatorclass="hilo"/><!--高地位主键生成器,产生唯一的主键 -->
</id>
<propertyname="name" column="name"/>
<many-to-onename="depart" column="depart_id" />
<union-subclassname="Skiller" table="skiller">
<propertyname="skill"/>
</union-subclass>
<union-subclassname="Sales" table="sales">
<propertyname="sell"/>
</union-subclass>
</class>
好处:
弊端:将要查询的表连接合并起来再加条件来查询,效率也不是太理想
总体建议:表的数量小于或者等于类的数量