zoukankan      html  css  js  c++  java
  • hibernate中基于主键映射1-1关联关系和基于外键映射1-1关联关系的不同

    基于主键映射1-1关联关系和基于外键映射1-1关联关系的不同,主要区别是在配置映射文件上会有区别

    两个持久化类为Manager和Department

    1:基于主键映射1-1关联关系

    1)使用其他持久化类的主键生成主键的实体的映射文件 首先需要指定主键生成方式为foreigner

    格式为:

    <id name="departmentId" type="java.lang.Integer">
    <column name="department_id"/>
    <!--使用外键的方式来生成当前的主键-->
    <generator class="foreign">
    <param name="property">manager</param>
    </generator>
    里面有一个param元素,property属性指定使用当前持久化类的哪一个属性的主键作为外键

    2)使用one-to-one元素映射关联属性且必须添加constrained="true"使当前的主键添加外键约束

    完整的映射文件代码如下
    Department.hbm.xml
    <?xml version="1.0"?>
    <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate Mapping DTD 3.0"
            "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
    <hibernate-mapping package="com.cqupt.dayday">
        <class name="Department" table="department"  >
            <id name="departmentId" type="java.lang.Integer">
                <column name="department_id"/>
                <!--使用外键的方式来生成当前的主键-->
                <generator class="foreign">
                    <!--property属性指定使用当前持久化类的哪一个属性的主键作为外键-->
                    <param name="property">manager</param>
                </generator>
            </id>
            <property name="departmentName" type="java.lang.String">
                <column name="department_name"/>
            </property>
            <!--
            采用foreigner主键生成器策略的一端增加one-to-one元素映射关联属性,
            其one-to-one属性还应增加constrained="true",以使当前的主键上添加外键约束
            另一端增加
            -->
            <one-to-one name="manager" class="Manager" constrained="true"></one-to-one>
        </class>
    </hibernate-mapping>

    Manager.hbm.xml
    <?xml version="1.0"?>
    <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate Mapping DTD 3.0"
            "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
    <hibernate-mapping package="com.cqupt.dayday">
        <class name="Manager" table="manager"  >
            <id name="managerId" type="java.lang.Integer">
                <column name="manager_id"/>
                <!--指定主键的生成方式, native:使用数据库本地方式-->
                <generator class="native"/>
            </id>
            <property name="managerName" type="java.lang.String">
                <column name="manager_name"/>
            </property>
            <!--映射1-1的关联关系:在对应的数据表中已经有外键了,当前持久化类使用one-to-one进行映射-->
            <one-to-one name="department" class="Department"></one-to-one>
        </class>
    </hibernate-mapping>
    
    
    

    2:基于外键映射1-1关联关系的不同

    1)使用外键的实体类映射文件中使用many-to-one来映射1-1关联关系,且必须指定unique="true"

    即一个部门只有一个经理,一个经理只有一个部门,每个部门对应的经理都是不一样的
    <many-to-one name="manager" class="Manager" column="manager_id" unique="true"></many-to-one>

    2)没有外键的实体类使用one-to-one映射1-1关联关系,必须指定property-ref="被关联实体类的引用"来指定使用被关联实体主键以外的字段作为关联字段
    <one-to-one name="department" class="Department" property-ref="manager"></one-to-one>
    完整的配置文件如下
    Department.hbm.xml
    <?xml version="1.0"?>
    <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate Mapping DTD 3.0"
            "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
    <hibernate-mapping package="com.cqupt.dayday">
        <class name="Department" table="department"  >
            <id name="departmentId" type="java.lang.Integer">
                <column name="department_id"/>
                <!--指定主键的生成方式, native:使用数据库本地方式-->
                <generator class="native"/>
            </id>
            <property name="departmentName" type="java.lang.String">
                <column name="department_name"/>
            </property>
            <!--使用many-to-one的方式来映射1-1关联关系-->
            <many-to-one name="manager" class="Manager" column="manager_id" unique="true"></many-to-one>
        </class>
    </hibernate-mapping>
    
    
    Manager.hbm.xml
    <?xml version="1.0"?>
    <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate Mapping DTD 3.0"
            "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
    <hibernate-mapping package="com.cqupt.dayday">
        <class name="Manager" table="manager"  >
            <id name="managerId" type="java.lang.Integer">
                <column name="manager_id"/>
                <!--指定主键的生成方式, native:使用数据库本地方式-->
                <generator class="native"/>
            </id>
            <property name="managerName" type="java.lang.String">
                <column name="manager_name"/>
            </property>
            <!--映射1-1的关联关系:在对应的数据表中已经有外键了,当前持久化类使用one-to-one进行映射-->
            <!--没有外键的一端要使用one-to-one元素,该元素使用property-ref属性来指定使用被关联实体主键以外的字段作为关联字段-->
            <one-to-one name="department" class="Department" property-ref="manager"></one-to-one>
        </class>
    </hibernate-mapping>
    
    
    
     
  • 相关阅读:
    css3 animate 和关键帧 @-webkit-keyframes
    CSS3 线性渐变(linear-gradient)
    css3 transition平滑过渡
    css3 变形设计涂鸦墙
    css3 图片翻转效果
    溢出隐藏
    顺序表的实现
    数论学习
    从BF算法到kmp算法详解
    王红梅、胡明、王涛编著的《数据结构c++》(第二版)模板类链表超详细代码
  • 原文地址:https://www.cnblogs.com/Hdaydayup/p/6500787.html
Copyright © 2011-2022 走看看