hibernate的映射关系

1集合映射

一个买家对应多个地址

 

Set集合的配置

 

        <!--接下来我们应该配置的是我们的集合映射  set集合-->

       

        <set name="addresses" table="t_address">

           <!--这里的这个key相当于是要配置外键  那么这个外键 是会自动的映射到当前的class的主键-->

           <!-- 下面的这个 u_id 会自动的映射成上面的主键的id值-->

           <key column="u_id"></key>

           <!--下面的这个列专门用来存放地址

                                       下面记住因为是集合所以集合中的数据的数据类型必须要写  否则报错

           -->

           <element column="address" type="java.lang.String"></element>

        </set>

 

 List集合配置

 

        <!--接下来我们应该配置的是我们的集合映射  list集合-->

        <list name="addresses" table="t_address_list">

           <!--配置的是我们的外键-->

           <key column="u_id"></key>

          

           <!--下面就是和set集合唯一区别 下面这个配置表示的是排序的列-->

           <list-index column="indexs"></list-index>

          

           <!--配置的是实质映射的字段-->

 

            <element column="address" type="java.lang.String"></element>     

        </list>

 

 

  Map集合的配置

 

        <!--下面就是map集合的映射-->

       

        <map name="addresses" table="t_address_map">

          

           <key column="u_id"></key>

         

           <map-key column="keys_001" type="java.lang.String"></map-key>

          

           <element column="address" type="java.lang.String"></element>

       

        </map>

 

注意:

1——在使用集合映射的时候  首先要掌握   必须要给定集合中的数据的数据类型   否则报错

2——在使用我们的List集合的是时候   需要给我们的List集合提供排序的列(必须的)

3——在使用map集合的时候   需要在集合映射表中添加key的映射字段

4——在集合中的<key></key>   这个表示的是集合要引用的键  这个外键是自动完成映射的

            外键会主动的映射到我们的实体的主键中去

 

一对多映射配置文件:

<!--下面就配置的是一对多的集合映射-->

        <set name="emps" table="t_employee" cascade="save-update,delete">

           <!--集合中的外键会自动的映射到上面的主键-->

           <key column="dept_id"></key>

           <one-to-many class="Employ"/>

        </set>

 

2  多对一映射配置文件:

     <many-to-one name="dept" class="Dept" column="dept_id"></many-to-one>

 

注意:实际开发中不需要两边配置,而且一般实际中都是多维护一

 

级联的问题 cascade

 

  <set name="emps" table="t_employee" cascade="save-update">

           <!--集合中的外键会自动的映射到上面的主键-->

           <key column="dept_id"></key>

           <one-to-many class="Employ"/>

        </set>

 

 cascade:级联 级联有三种 :save-update 级联的保存和更新   delete 级联的删除    all(前面两个家伙的并集)

 

  级联的保存和更新是可以用的  但是在开发中一般情况下 级联的删除是不会用到的  因为他会影响到多张表

 

4多对多的关联映射

 

一个程序员可以开发多个项目    程序员----->项目(一对多的关系)

 一个项目是由多个开发人员来进行开发   项目----->程序员(一对多的关系)

综上所述  两个一对多的关系就构成了  多对多的关系

 Project的一方的配置

 

        <!--配置的是多对多的集合映射-->

        <set name="devs" table="t_relation" cascade="all">

           <!--上面的这个key你记住就是映射的当前的类的主键-->

            <key column="pro_id"></key>

            <!--配置的是相关联的另外一张表

                column:配置的是对方的主键在关系表中映射的这个值的列名

                class:配置的是对方的这个名字

            -->

         <many-to-many column="dev_id" class="Developer"></many-to-many>

        </set>

 

 

 Developer一方的配置

 

         <!--配置的是多对多的集合映射-->

        <set name="pros" table="t_relation" cascade="all">

           <!--上面的这个key你记住就是映射的当前的类的主键-->

            <key column="dev_id"></key>

            <!--配置的是相关联的另外一张表

                column:配置的是对方的主键在关系表中映射的这个值的列名

                class:配置的是对方的这个名字

            -->

            <many-to-many column="pro_id" class="Project"></many-to-many>

        </set>

 

 5   继承映射

 

 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  所有自类个父类对应一张表

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

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

<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所有类都对应表

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>

 

 

6一对一映射

需求:人和身份证的问题

 

   一个人 只有一个身份证

 

   一个身份证是不是也只是对应了 一个人

 

   人----->身份证   一对一的关系

 

   身份证------>人  一对一的关系

身份证的配置

 

   <hibernate-mapping package="com.qf.one2one">

    <class name="IdCard" table="t_idcard">

        <!--配置的是表里面的主键-->

        <id name="cardId" type="java.lang.Integer">

            <generator class="native">

            </generator>

        </id>

  

        <!--配置的是普通的列-->

        <property name="cardNum"></property>

       

        <!--下面配置的是引用主键的这一方-->

        <many-to-one name="people" column="p_id" class="People" cascade="all"></many-to-one>

    </class>

</hibernate-mapping>

 

 

  People的配置

 

   <hibernate-mapping package="com.qf.one2one">

    <class name="People" table="t_people">

        <!--配置的是表里面的主键-->

        <id name="pId" type="java.lang.Integer">

            <generator class="native">

            </generator>

        </id>

  

        <!--配置的是普通的列-->

        <property name="name"></property>

       

       

        <!--接下来应该配置一对一的映射-->

        <one-to-one name="idCard" class="IdCard" cascade="all"></one-to-one>

 

    </class>

</hibernate-mapping>

 

 

 

  把第一个的主键作为第二个的主键

 

posted @ 2017-09-06 20:25  123hk  阅读(195)  评论(0编辑  收藏  举报