继承映射

继承的映射实现以及说明

       方式一:一个类继承体系一张表

整个继承体系就用一张表。设计一张表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>

       好处:

       弊端:将要查询的表连接合并起来再加条件来查询,效率也不是太理想

 

 

总体建议:表的数量小于或者等于类的数量

你可能感兴趣的:(xml,table,null,Class,扩展)