hibernate中基于主键映射1-1关联关系和基于外键映射1-1关联关系的不同

Posted 何甜甜在吗

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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>

 

 



















以上是关于hibernate中基于主键映射1-1关联关系和基于外键映射1-1关联关系的不同的主要内容,如果未能解决你的问题,请参考以下文章

Hibernate关联关系映射之一对一关联关系

Hibernate 一对一关联关系

Hibernate学习笔记---hibernate关联关系映射

Hibernate,关系映射的多对一单向关联多对一双向关联一对一主键关联一对一外键关联多对多关系关联

Hibernate之关联关系映射(一对一主键映射和一对一外键映射)

Hibernate学习———— hibernate一对一关系映射详解