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>
    
    
    
     
  • 相关阅读:
    每日一题
    每日一题
    每日一题
    每日一题
    每日一题
    Tensorflow学习(四)——递归神经网络RNN
    Tensorflow学习(三)——卷积神经网络应用于MNIST数据集分类
    Tenserflow学习(二)——MNIST数据集分类三层网络搭建+Dropout+tensorboard可视化
    Tenserflow学习(一)——MNIST数据集分类简单版本
    蓝桥杯第十届(2019)B组省赛1-9题练手源码
  • 原文地址:https://www.cnblogs.com/Hdaydayup/p/6500787.html
Copyright © 2011-2022 走看看