继承的映射实现以及说明

继承的映射实现以及说明

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

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

       好处:字段中没有null值,关系明确清楚。

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

 

 

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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值