基于主键映射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>
时间: 2024-10-14 17:10:16