继承映射的四种模式的配置

继承映射

   四种模式
 
    1、普通的继承映射

   需求:现在有动物(Animal这个类)  还有Dog这个类  和  Fish这个类  要求使用继承映射来完成这个关联关系的配置

   <hibernate-mapping package="com.qf.extend2">
    <class name="Dog" table="t_dog">
        <!--配置的是表里面的主键-->
        <id name="id" type="java.lang.Integer">
            <generator class="native">
            </generator>
        </id>
        <!--配置的是普通的列-->
        <property name="color"></property>
        <property name="name"></property>
        <property name="num"></property>
    </class>
   </hibernate-mapping>
   

    2、所有子类对应一张表   父类也对应表

    //让所有的继承类共同存储到一张表中去(就是要怎么存储?)

    分类:首先得有分类  只有有了分类之后那么这个才知道是谁的数据

    表的字段应该包含所有的字段

    t_animal_01

    id     color     name    type    fishCoatCount   num

     1   金黄金黄的   小狗    dog                      23

     2    黑黄的     小金鱼   fish       12345


    <hibernate-mapping package="com.qf.extend3">
    <class name="Animal" table="t_animal_01">
        <!--配置的是表里面的主键-->
        <id name="id" type="java.lang.Integer">
            <generator class="native">
            </generator>
        </id>
   
        
        <!-- 下面就配置一个非公共的 -->
        <!--首先的整个分类
                               下面这个就是分类的这个列
        -->
        <discriminator column="type_" length="30" type="string"></discriminator>
        
        <!--配置的是普通的列-->
        <property name="color"></property>
        <property name="name"></property>
        
        <!--分别来配置我们的 dog 和  fish了-->
        <subclass name="Dog" discriminator-value="dog_">
           <!--要给这个孩子配置个类型-->
           <property name="num" type="string"></property>
        </subclass>
        
        <!--配置鱼的信息-->
        <subclass name="Fish" discriminator-value="fish_">
           <property name="fishCoatCount" type="java.lang.Integer"></property>
        </subclass> 

    </class>
</hibernate-mapping>


    3、我们的所有类都对应表

     Animal 

     id    name    color

      1    小黑    绿色

      2    小金鱼  金色


     Dog

     id    num     ?

      1    56.7


     Fish

     id   fishCoatCount ?

     2     34


  1>:要实现分表的话那么首先要 将Anianl的主键自增长给我改了...
  2>:使用的是join-class来完成分表的

  <hibernate-mapping package="com.qf.extend4">
    <class name="Animal" table="t_animal_02">
        <!--配置的是表里面的主键-->
        <id name="id" type="string">
	<!-主键不能自增-->
            <generator class="assigned">
            </generator>
        </id>
        
        <!--配置的是普通的列-->
        <property name="color"></property>
        <property name="name"></property>
        
        <!--接下来就是配置我们的分表了-->
        <joined-subclass name="Dog" table="t_dog_02">
           <!--这里的key会自动的映射到上面class的主键上面去-->
           <key column="id"></key>
           <!--配置的是其他的列-->
           <property name="num"></property>
        </joined-subclass>
        
        <!--接下来配置我们的fish-->
        <joined-subclass name="Fish" table="t_fish_02">
           <!--这里的key会自动的映射到上面class的主键上面去-->
           <key column="id"></key>
           <!--配置的是其他的列-->
           <property name="fishCoatCount"></property>
        </joined-subclass>
        
    </class>
</hibernate-mapping>


    4、父类不对应表 子类类对应表(主)

    为什么不用第一种呢?因为第一种要编写很多的配置文件  不好使...
	第二种  子类在一个表中会有空余的属性   占空间 
	第三种   删除父类  子类也会被删除  一般来说 尽量避免表中的一删全删

    <hibernate-mapping package="com.qf.extend5">
    <!-- abstract="true":这个表示的是不对应表  -->
    <class name="Animal" abstract="true">
        <!--配置的是表里面的主键-->
        <id name="id" type="string">
	<!-主键不能自增-->
            <generator class="assigned">
            </generator>
        </id>
        
        <!--配置的是普通的列-->
        <property name="color"></property>
        <property name="name"></property>
        <!--接下来就是配置加表的问题-->
        <union-subclass name="Dog" table="t_dog_03">
           <property name="num"></property>
        </union-subclass>
        <!--下面就配置鱼了-->
        <union-subclass name="Fish" table="t_fish_03">
           <property name="fishCoatCount"></property>
        </union-subclass>
        
    </class>
</hibernate-mapping>

展开阅读全文

没有更多推荐了,返回首页