Hibernate中映射一對一關聯(按主鍵映射和外鍵映射)和組件映射


                                                                     

                                                    Hibernate中映射一對一關聯(按主鍵映射和外鍵映射)和組件映射

 

Hibernate提供了兩種映射一對一關聯關系的方式:按照外鍵映射按照主鍵映射

下面以員工賬號員工檔案表為例,介紹這兩種映射方式,並使用這兩種映射方式分別完成以下持久化操作:

(1)保存員工檔案的同時分配給員工一個賬號。

(2)加載員工檔案的同時加載賬號信息。

1.按照外鍵映射

步驟一:創建實體類Users1和Resume1

 

 1 package cn.happy.onetoone.fk;
 2 
 3 public class Resume1 {
 4     private Integer resId;
 5     private Integer resUserId;
 6     private String resName;
 7     private String resCardNo;
 8     private Users1 users1;
 9     
10     
11     public Integer getResId() {
12         return resId;
13     }
14     public void setResId(Integer resId) {
15         this.resId = resId;
16     }
17     public Integer getResUserId() {
18         return resUserId;
19     }
20     public void setResUserId(Integer resUserId) {
21         this.resUserId = resUserId;
22     }
23     public String getResName() {
24         return resName;
25     }
26     public void setResName(String resName) {
27         this.resName = resName;
28     }
29     public String getResCardNo() {
30         return resCardNo;
31     }
32     public void setResCardNo(String resCardNo) {
33         this.resCardNo = resCardNo;
34     }
35     public Users1 getUsers1() {
36         return users1;
37     }
38     public void setUsers1(Users1 users1) {
39         this.users1 = users1;
40     }
41     
42     
43 }
Resume1
 1 <?xml version="1.0"?>
 2 <!DOCTYPE hibernate-mapping PUBLIC
 3         "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
 4         "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
 5         <hibernate-mapping package="cn.happy.onetoone.fk">
 6         
 7         <class name="Resume1" table="Resume1">
 8         <id name="resId" column="RESID">
 9          <generator class="sequence">
10          <param name="sequence">STU_SID</param>
11          </generator>
12         </id>
13         <property name="resName" type="string" column="RESRNAME"></property>
14         <property name="resCardNo" type="string" column="RESCARDNO"></property>
15         <many-to-one name="users1" class="Users1" column="RESUSERSID" cascade="all" unique="true"></many-to-one>
16         </class>
17         
18         </hibernate-mapping>
Resume1.hbm.xml

 

 1 package cn.happy.onetoone.fk;
 2 
 3 public class Users1 {
 4     private Integer userId;
 5     private String userName;
 6     private String userpass;
 7     public String getUserpass() {
 8         return userpass;
 9     }
10     public void setUserpass(String userpass) {
11         this.userpass = userpass;
12     }
13     private Resume1 resume1;
14     
15     
16     
17     public Integer getUserId() {
18         return userId;
19     }
20     public void setUserId(Integer userId) {
21         this.userId = userId;
22     }
23     public String getUserName() {
24         return userName;
25     }
26     public void setUserName(String userName) {
27         this.userName = userName;
28     }
29     
30     public Resume1 getResume1() {
31         return resume1;
32     }
33     public void setResume1(Resume1 resume1) {
34         this.resume1 = resume1;
35     }
36 }
Users1.java
 1 <?xml version="1.0"?>
 2 <!DOCTYPE hibernate-mapping PUBLIC
 3         "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
 4         "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
 5         <hibernate-mapping package="cn.happy.onetoone.fk">
 6         
 7         <class name="Users1" table="Users1">
 8         <id name="userId" column="USERID">
 9          <generator class="sequence">
10          <param name="sequence">STU_SID</param>
11          </generator>
12         </id>
13         <property name="userName" type="string" column="USERNAME"></property>
14         <property name="userpass" type="string" column="USERPASS"></property>
15         <one-to-one name="resume1" class="Resume1" property-ref="users1"></one-to-one>
16         </class>
17         
18         </hibernate-mapping>
Users1.hbm.xml

步驟二:配置文件Users1.hbm.xml和Resume1.hbm.xml

步驟三:測試方法書寫

 1 package cn.happy.onetoone.fk;
 2 
 3 import org.hibernate.Session;
 4 import org.hibernate.Transaction;
 5 import org.junit.Test;
 6 
 7 import cn.happy.util.HibernateUtil;
 8 
 9 public class Testone {
10     /**
11      * 一對一    按外鍵映射
12      * **/
13      @Test
14      public void onetoont(){
15          Session session = HibernateUtil.currentSession();
16          Transaction tx = session.beginTransaction();
17          Resume1 re=new Resume1();
18          re.setResName("學院不");
19          re.setResCardNo("002");
20          
21          Users1 use=new Users1();
22          use.setUserName("王喜");
23          
24          use.setResume1(re);
25          re.setUsers1(use);
26          
27          session.save(re);
28          tx.commit();
29          HibernateUtil.closeSession();
30          
31      }
32      
33      
34      @Test
35      public void select(){
36          Session session = HibernateUtil.currentSession();
37          Transaction tx = session.beginTransaction();
38          Users1 u =(Users1) session.get(Users1.class, 2);
39          System.out.println(u.getResume1().getResName());
40          tx.commit();
41          HibernateUtil.closeSession();
42      }
43      
44      
45  
46      
47 }
測試

 

二:按照主鍵映射

步驟一:創建實體類Users2和Resume2

 1 package cn.happy.onetoone.pk;
 2 
 3 public class Resume2 {
 4     private Integer resId;
 5     private Integer resUserId;
 6     private String resName;
 7     private String resCardNo;
 8     private Users2 users1;
 9     
10     
11     public Integer getResId() {
12         return resId;
13     }
14     public void setResId(Integer resId) {
15         this.resId = resId;
16     }
17     public Integer getResUserId() {
18         return resUserId;
19     }
20     public void setResUserId(Integer resUserId) {
21         this.resUserId = resUserId;
22     }
23     public String getResName() {
24         return resName;
25     }
26     public void setResName(String resName) {
27         this.resName = resName;
28     }
29     public String getResCardNo() {
30         return resCardNo;
31     }
32     public void setResCardNo(String resCardNo) {
33         this.resCardNo = resCardNo;
34     }
35     public Users2 getUsers1() {
36         return users1;
37     }
38     public void setUsers1(Users2 users1) {
39         this.users1 = users1;
40     }
41     
42     
43 }
Resume2.java
 1 <?xml version="1.0"?>
 2 <!DOCTYPE hibernate-mapping PUBLIC
 3         "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
 4         "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
 5         <hibernate-mapping package="cn.happy.onetoone.pk">
 6         
 7         <class name="Resume2" table="Resume2">
 8         <id name="resId" column="RESID">
 9          <generator class="sequence">
10          <param name="sequence">STU_SID</param>
11          </generator>
12         </id>
13         <property name="resName" type="string" column="RESRNAME"></property>
14         <property name="resCardNo" type="string" column="RESCARDNO"></property>
15         <one-to-one name="users1" class="Users2" cascade="all" ></one-to-one>
16         </class>
17         
18         </hibernate-mapping>
Resume2.hbm.xml

 

 

 1 package cn.happy.onetoone.pk;
 2 
 3 public class Users2 {
 4     private Integer userId;
 5     private String userName;
 6     private Resume2 resume1;
 7     
 8     
 9     
10     public Integer getUserId() {
11         return userId;
12     }
13     public void setUserId(Integer userId) {
14         this.userId = userId;
15     }
16     public String getUserName() {
17         return userName;
18     }
19     public void setUserName(String userName) {
20         this.userName = userName;
21     }
22     
23     public Resume2 getResume1() {
24         return resume1;
25     }
26     public void setResume1(Resume2 resume1) {
27         this.resume1 = resume1;
28     }
29 }
Users2.java
 1 <?xml version="1.0"?>
 2 <!DOCTYPE hibernate-mapping PUBLIC
 3         "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
 4         "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
 5         <hibernate-mapping package="cn.happy.onetoone.pk">
 6         
 7         <class name="Users2" table="Users2">
 8         <id name="userId" column="USERID">
 9          <generator class="foreign">
10          <param name="property">resume1</param>
11          </generator>
12         </id>
13         <property name="userName" type="string" column="USERNAME"></property>
14         
15         <one-to-one name="resume1" class="Resume2" constrained="true"></one-to-one>
16         </class>
17         
18         </hibernate-mapping>
Users2.hbm.xml

步驟二:配置文件Users2.hbm.xml和Resume2.hbm.xml

 

 

 

 

 步驟三:測試方法書寫

 1 package cn.happy.onetoone.pk;
 2 
 3 import org.hibernate.Session;
 4 import org.hibernate.Transaction;
 5 import org.junit.Test;
 6 
 7 import cn.happy.util.HibernateUtil;
 8 
 9 public class Testone {
10     /**
11      * 一對一  按主鍵映射
12      * */
13      @Test
14      public void onetoont(){
15          Session session = HibernateUtil.currentSession();
16          Transaction tx = session.beginTransaction();
17          Resume2 re=new Resume2();
18          re.setResName("學院不2");
19          re.setResCardNo("2");
20          
21          Users2 use=new Users2();
22          use.setUserName("王喜2");
23          
24          use.setResume1(re);
25          re.setUsers1(use);
26          
27          session.save(re);
28          tx.commit();
29          HibernateUtil.closeSession();
30          
31      }
32      
33      
34      @Test
35      public void select(){
36          Session session = HibernateUtil.currentSession();
37          Transaction tx = session.beginTransaction();
38          Users2 u =(Users2) session.get(Users2.class, 1);
39          System.out.println(u.getResume1().getResName());
40          tx.commit();
41          HibernateUtil.closeSession();
42      }
43      
44      
45      
46 }
測試代碼

 

 

 

 3.組件映射

建立關系數據模型的一個重要原則是在不會導致數據冗余的前提下,盡可能減少數據庫表的數目及表之間的外鍵參照關系。以員工信息為例,員工信息中有員工的家庭地址信息,如果把地址信息單獨放在一張表中,然后建立員工信息表和地址信息表之間的外鍵參照關系,當每次查詢員工信息時,都需建立者兩個表的連接。建立表的連接是很耗時的操作,為了提高數據庫運行性能,可以把這兩張表的信息整合在一張員工信息表EMPINFO中

 

 

步驟一:創建EmpHomeAddress和EmpInfo

 1 package cn.happy.zujian;
 2 
 3 public class EmpInfo {
 4   private Integer eId;
 5   private String eName;
 6   private EmpHomeAddress eHome;
 7   
 8   
 9 public Integer geteId() {
10     return eId;
11 }
12 public void seteId(Integer eId) {
13     this.eId = eId;
14 }
15 public String geteName() {
16     return eName;
17 }
18 public void seteName(String eName) {
19     this.eName = eName;
20 }
21 public EmpHomeAddress geteHome() {
22     return eHome;
23 }
24 public void seteHome(EmpHomeAddress eHome) {
25     this.eHome = eHome;
26 }
27 }
EmpInfo.java
 1 package cn.happy.zujian;
 2 
 3 public class EmpHomeAddress {
 4   private String ehomestreet;
 5   private String ehomecity;
 6   private String ehomeprovince;
 7   private String ehomezipcode;
 8   
 9   private EmpInfo empinfo;
10 public EmpInfo getEmpinfo() {
11     return empinfo;
12 }
13 public void setEmpinfo(EmpInfo empinfo) {
14     this.empinfo = empinfo;
15 }
16 public String getEhomestreet() {
17     return ehomestreet;
18 }
19 public void setEhomestreet(String ehomestreet) {
20     this.ehomestreet = ehomestreet;
21 }
22 public String getEhomecity() {
23     return ehomecity;
24 }
25 public void setEhomecity(String ehomecity) {
26     this.ehomecity = ehomecity;
27 }
28 public String getEhomeprovince() {
29     return ehomeprovince;
30 }
31 public void setEhomeprovince(String ehomeprovince) {
32     this.ehomeprovince = ehomeprovince;
33 }
34 public String getEhomezipcode() {
35     return ehomezipcode;
36 }
37 public void setEhomezipcode(String ehomezipcode) {
38     this.ehomezipcode = ehomezipcode;
39 }
40   
41 }
EmpHomeAddress
 1 <?xml version="1.0"?>
 2 <!DOCTYPE hibernate-mapping PUBLIC
 3         "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
 4         "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
 5         <hibernate-mapping package="cn.happy.zujian">
 6         
 7         <class name="EmpInfo" table="EMPINFO">
 8         <id name="eId" column="EID">
 9          <generator class="sequence">
10          <param name="sequence">STU_SID</param>
11          </generator>
12         </id>
13         <property name="eName" type="string" column="ENAME"></property>
14         
15         <component name="eHome" class="EmpHomeAddress">
16         <parent name="empinfo"/>
17         <property name="ehomestreet" column="EHOMESTREET" type="string"></property>
18         <property name="ehomecity" column="EHOMECITY" type="string"></property>
19         <property name="ehomeprovince" column="EHOMEPROVINCE" type="string"></property>
20         <property name="ehomezipcode" column="EHOMEZIPCODE" type="string"></property>
21         </component>
22        
23        
24         </class>
25         
26         </hibernate-mapping>
EmpInfo.hbm.xml

 

步驟二:創建配置文件EmpInfo.hbm.xml

 

步驟三:書寫測試類

 1 package cn.happy.zujian;
 2 
 3 import org.hibernate.Session;
 4 import org.hibernate.Transaction;
 5 import org.junit.Test;
 6 
 7 import cn.happy.util.HibernateUtil;
 8 
 9 public class TestInfo {
10     /**
11      * 組件映射 
12      * */
13   @Test
14   public void zujian(){
15       Session session = HibernateUtil.currentSession();
16       Transaction tx = session.beginTransaction();
17       
18       EmpInfo empinfo=new EmpInfo();
19       empinfo.seteName("回青");
20       
21       EmpHomeAddress address=new EmpHomeAddress();
22       address.setEhomecity("北京");
23       address.setEhomeprovince("北京市");
24       address.setEhomestreet("成府路");
25       address.setEhomezipcode("10002");
26       empinfo.seteHome(address);
27       
28       session.save(empinfo);
29       tx.commit();
30       
31       HibernateUtil.closeSession();
32       
33   }
34 }
測試代碼

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM