码迷,mamicode.com
首页 > Web开发 > 详细

Hibernate继承关系配置

时间:2015-09-25 10:48:59      阅读:145      评论:0      收藏:0      [点我收藏+]

标签:

Hibernate继承关系配置
 
————————————————————————————————————————————————————————
 
1. 整个继承关系映射到一张表(single-table-per-hierarchy) 
优点:不管是查询父类还是子类,只需要查询一张表,性能比较好。 
缺点:扩展性不好,当需要增加子类或者属性,我们需要往表中增加字段,很多字段都空置,不符合面向对象编程的思想。 
 
<class name="Employee" discriminator-value="0">  
    <id name="id">  
        <generator class="native"/>  
    </id>  
    <!-- 增加一个字段,以区别对应的是哪个实体 -->  
    <discriminator column="type" type="string"/>  
    <property name="name" length="20" not-null="true"/>  
    <many-to-one name="department" column="depart_id" cascade="save-update" fetch="join" lazy="no-proxy" />  
      
    <!-- Inheritance - Single-Table-Per-Hierarchy -->  
    <subclass name="Developer" discriminator-value="3">  
        <property name="develop" length="40"/>  
    </subclass>  
      
    <subclass name="Tester" discriminator-value="4">  
        <property name="test" length="40"/>  
    </subclass>  
</class> 
 
————————————————————————————————————————————————————————
 
2. 每个类映射到一个表(joined-subclass) 
每个子类实例的数据会放在两张表里:父类表(基本属性)和子类表(子类特有的属性) 
优点:父类表中没有空置的字段。 
缺点:查询子类数据需要连表查询(父类表和子类表),效率不高。 
适合:子类较少,每个子类的属性都各不相同。
 
<class name="Employee">  
    <id name="id">  
        <generator class="native"/>  
    </id>  
    <property name="name" length="20" not-null="true"/>  
    <many-to-one name="department" column="depart_id" cascade="save-update" fetch="join" lazy="no-proxy" />  
      
    <!-- Inheritance -->  
    <joined-subclass name="Developer">  
        <key column="develop_id" foreign-key="id"/>  
        <property name="develop" length="40"/>  
    </joined-subclass>  
    <joined-subclass name="Tester">  
        <key column="test_id" foreign-key="id"/>        
        <property name="test" length="40"/>  
    </joined-subclass>  
</class>  
</hibernate-mapping>  
————————————————————————————————————————————————————————
3. 鉴别器和内联器结合 
 
充分利用1和2的优点
 
<hibernate-mapping package="com.john.myhibernate.domain">  
  
<class name="Employee" discriminator-value="0">  
    <id name="id">  
        <generator class="native"/>  
    </id>  
    <discriminator column="type" type="string"/>  
    <property name="name" length="20" not-null="true"/>  
    <many-to-one name="department" column="depart_id" cascade="save-update" fetch="join" lazy="no-proxy" />  
      
    <!-- Inheritance -->  
    <subclass name="Developer" discriminator-value="3">  
        <property name="develop" length="40"/>  
    </subclass>  
    <subclass name="Tester" discriminator-value="4">  
        <join table="my_tester">  
            <key column="test_id" foreign-key="id"/>  
            <property name="test" length="40"/>  
        </join>  
    </subclass>     
</class>  
</hibernate-mapping>  
 
————————————————————————————————————————————————————————
4. 每个具体类映射一张独立表(union-subclass) 
 
和2不同,这里子类的所有属性(包括从父类继承的)会保存到一张独立的表中。 
 
Employee.hbm.xml: 
 
<class name="Employee">  
    <id name="id">  
        <generator class="hilo"/>  
    </id>  
    <property name="name" length="20" not-null="true"/>  
    <many-to-one name="department" column="depart_id" cascade="save-update" fetch="join" lazy="no-proxy" />  
      
    <!-- Inheritance -->  
    <union-subclass name="Developer" table="developer">  
        <property name="develop" length="40"/>  
    </union-subclass>  
    <union-subclass name="Tester" table="tester">  
        <property name="test" length="40"/>  
    </union-subclass>   
</class>  
</hibernate-mapping>  
 
这里的id生成器用的是hilo(或uuid)。 
native(mysql里是自动增长)方式不可以: 
id值会重复。 
如Employee, Developer和Tester三张独立的表,每张表的id都是从1开始自增长的。 
当查询id为1的Employee的时候,会查询到3个对象。
————————————————————————————————————————————————————————

Hibernate继承关系配置

标签:

原文地址:http://www.cnblogs.com/lsx1993/p/4837218.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!