• 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 }
    测试代码
  • 相关阅读:
    angular学习一框架结构认识
    关于react上线系列问题及解决方案
    typescript学习笔记
    keepalived + glusterfs实现高可用
    nginx限制单个IP的最大连接数量限制下载速度
    初识Python.day2
    初识Python
    服务器安装到优化
    windows云服务器数据迁移
    z字形变换
  • 原文地址:https://www.cnblogs.com/hmy-1365/p/5784048.html
Copyright © 2020-2023  润新知