hibernate映射-基于主键映射的1-1关联关系

(学习记录,错误不足之处,请您耐心指正^_^)

hibernate映射-基于主键映射的1-1关联关系

基于主键的映射策略:指一端的主键生成器使用foreign策略,表明根据对方的主键来生成自己的主键,自己并不独立生成主键。

一、代码示例:

{类文件↓}

Manager.class

 1 package com.zit.hibernate.one2one.primary;
 2 
 3 public class Manager {
 4     
 5     private Integer mgrId;
 6     private String mgrName;
 7     
 8     private Department dept;
 9     
10     public Integer getMgrId() {
11         return mgrId;
12     }
13 
14     public void setMgrId(Integer mgrId) {
15         this.mgrId = mgrId;
16     }
17 
18     public String getMgrName() {
19         return mgrName;
20     }
21 
22     public void setMgrName(String mgrName) {
23         this.mgrName = mgrName;
24     }
25 
26     public Department getDept() {
27         return dept;
28     }
29 
30     public void setDept(Department dept) {
31         this.dept = dept;
32     }
33     
34 }
Manager.class

Department.class

 1 package com.zit.hibernate.one2one.primary;
 2 
 3 public class Department {
 4     
 5     private Integer deptId;
 6     private String deptName;
 7     
 8     private Manager mgr;
 9 
10     public Integer getDeptId() {
11         return deptId;
12     }
13 
14     public void setDeptId(Integer deptId) {
15         this.deptId = deptId;
16     }
17 
18     public String getDeptName() {
19         return deptName;
20     }
21 
22     public void setDeptName(String deptName) {
23         this.deptName = deptName;
24     }
25 
26     public Manager getMgr() {
27         return mgr;
28     }
29 
30     public void setMgr(Manager mgr) {
31         this.mgr = mgr;
32     }
33     
34 }
Department.class

{映射文件↓}

Manager.hbm.xml

 1 <?xml version="1.0"?>
 2 <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
 3 "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
 4 <!-- Generated 2015-11-30 14:30:53 by Hibernate Tools 3.4.0.CR1 -->
 5 <hibernate-mapping package="com.zit.hibernate.one2one.primary">
 6     <class name="Manager" table="MANAGERS_2">
 7         <id name="mgrId" type="java.lang.Integer">
 8             <column name="MGR_ID" />
 9             <generator class="native" />
10         </id>
11         <property name="mgrName" type="java.lang.String">
12             <column name="MGR_NAME" />
13         </property>
14         
15         <!-- 映射1-1的关联关系 :在对应是数据表中已经有外键了,使用one-to-one 进行映射-->
16         <one-to-one name="dept" class="Department"
17             >
18         </one-to-one>
19         
20         
21     </class>
22 </hibernate-mapping>
Manager.hbm.xml

Department.hbm.xml

 1 <?xml version="1.0"?>
 2 <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
 3 "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
 4 <!-- Generated 2015-11-30 14:30:53 by Hibernate Tools 3.4.0.CR1 -->
 5 <hibernate-mapping package="com.zit.hibernate.one2one.primary">
 6     <class name="Department" table="DEPARTMENTS_2">
 7         <id name="deptId" type="java.lang.Integer">
 8             <column name="DEPT_ID" />
 9             <generator class="foreign">
10                 <param name="property">mgr</param>
11             </generator>
12         </id>
13         <property name="deptName" type="java.lang.String">
14             <column name="DEPT_NAME" />
15         </property>
16         
17         <one-to-one name="mgr" class="Manager"
18             constrained="true">
19         </one-to-one>
20         
21         
22     </class>
23 </hibernate-mapping>
Department.hbm.xml

注意:在指定了foreign为主键生成策略的映射文件中,one-to-one属性一定要增加 constrained="true"属性,不然两张表之间不会有外键关联。

     增加 constrained="true",以使当前主键上添加外键约束

而主键生成器的配置中,<param name="property">mgr</param>   这里mgr为当前持久化类关联的另一个持久化类的属性名。指定当前持久化类的哪一个属性的主键作为外键。

二、使用注意:

1.保存数据时,无论先save(manager),还是先save(department),hibernate都会先插入manager,再插入department,

   因为 department表是以manager表的主键为自己的主键,若manager表中没有对应记录的主键,则department自己也无法插入数据。

  都不会有多余的UPDATE语句。

2.查询时,若先查询manager,会用左外连接一并查出关联的department;

   但是在查询条件中:on manager0_.MGR_ID=department1_.DEPT_ID   这里这个条件就是正确的,因为两个表中相关联的两个记录主键永远相同。

   若先查询department,会用懒加载。

(学习记录,错误不足之处,请您耐心指正^_^)

原文地址:https://www.cnblogs.com/zitt/p/5075464.html