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>


 
原文地址:https://www.cnblogs.com/Hdaydayup/p/6500787.html