Hibernate中映射一对一关联(按主键映射和外键映射)和组件映射
Hibernate提供了两种映射一对一关联关系的方式:按照外键映射和按照主键映射。
下面以员工账号和员工档案表为例,介绍这两种映射方式,并使用这两种映射方式分别完成以下持久化操作:
(1)保存员工档案的同时分配给员工一个账号。
(2)加载员工档案的同时加载账号信息。
1.按照外键映射
步骤一:创建实体类Users1和Resume1
1 packagecn.happy.onetoone.fk;2
3 public classResume1 {4 privateInteger resId;5 privateInteger resUserId;6 privateString resName;7 privateString resCardNo;8 privateUsers1 users1;9
10
11 publicInteger getResId() {12 returnresId;13 }14 public voidsetResId(Integer resId) {15 this.resId =resId;16 }17 publicInteger getResUserId() {18 returnresUserId;19 }20 public voidsetResUserId(Integer resUserId) {21 this.resUserId =resUserId;22 }23 publicString getResName() {24 returnresName;25 }26 public voidsetResName(String resName) {27 this.resName =resName;28 }29 publicString getResCardNo() {30 returnresCardNo;31 }32 public voidsetResCardNo(String resCardNo) {33 this.resCardNo =resCardNo;34 }35 publicUsers1 getUsers1() {36 returnusers1;37 }38 public voidsetUsers1(Users1 users1) {39 this.users1 =users1;40 }41
42
43 }
Resume1
1 <?xml version="1.0"?>
2 "-//Hibernate/Hibernate Mapping DTD 3.0//EN"4 "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
5
6
7
8
9
10 STU_SID
11
12
13
14
15
16
17
18
Resume1.hbm.xml
1 packagecn.happy.onetoone.fk;2
3 public classUsers1 {4 privateInteger userId;5 privateString userName;6 privateString userpass;7 publicString getUserpass() {8 returnuserpass;9 }10 public voidsetUserpass(String userpass) {11 this.userpass =userpass;12 }13 privateResume1 resume1;14
15
16
17 publicInteger getUserId() {18 returnuserId;19 }20 public voidsetUserId(Integer userId) {21 this.userId =userId;22 }23 publicString getUserName() {24 returnuserName;25 }26 public voidsetUserName(String userName) {27 this.userName =userName;28 }29
30 publicResume1 getResume1() {31 returnresume1;32 }33 public voidsetResume1(Resume1 resume1) {34 this.resume1 =resume1;35 }36 }
Users1.java
1 <?xml version="1.0"?>
2 "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
4 "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
5
6
7
8
9
10 STU_SID
11
12
13
14
15
16
17
18
Users1.hbm.xml
步骤二:配置文件Users1.hbm.xml和Resume1.hbm.xml
步骤三:测试方法书写
1 packagecn.happy.onetoone.fk;2
3 importorg.hibernate.Session;4 importorg.hibernate.Transaction;5 importorg.junit.Test;6
7 importcn.happy.util.HibernateUtil;8
9 public classTestone {10 /**
11 * 一对一 按外键映射12 * **/
13 @Test14 public voidonetoont(){15 Session session =HibernateUtil.currentSession();16 Transaction tx =session.beginTransaction();17 Resume1 re=newResume1();18 re.setResName("学院不");19 re.setResCardNo("002");20
21 Users1 use=newUsers1();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 @Test35 public voidselect(){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 packagecn.happy.onetoone.pk;2
3 public classResume2 {4 privateInteger resId;5 privateInteger resUserId;6 privateString resName;7 privateString resCardNo;8 privateUsers2 users1;9
10
11 publicInteger getResId() {12 returnresId;13 }14 public voidsetResId(Integer resId) {15 this.resId =resId;16 }17 publicInteger getResUserId() {18 returnresUserId;19 }20 public voidsetResUserId(Integer resUserId) {21 this.resUserId =resUserId;22 }23 publicString getResName() {24 returnresName;25 }26 public voidsetResName(String resName) {27 this.resName =resName;28 }29 publicString getResCardNo() {30 returnresCardNo;31 }32 public voidsetResCardNo(String resCardNo) {33 this.resCardNo =resCardNo;34 }35 publicUsers2 getUsers1() {36 returnusers1;37 }38 public voidsetUsers1(Users2 users1) {39 this.users1 =users1;40 }41
42
43 }
Resume2.java
1 <?xml version="1.0"?>
2 "-//Hibernate/Hibernate Mapping DTD 3.0//EN"4 "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
5
6
7
8
9
10 STU_SID
11
12
13
14
15
16
17
18
Resume2.hbm.xml
1 packagecn.happy.onetoone.pk;2
3 public classUsers2 {4 privateInteger userId;5 privateString userName;6 privateResume2 resume1;7
8
9
10 publicInteger getUserId() {11 returnuserId;12 }13 public voidsetUserId(Integer userId) {14 this.userId =userId;15 }16 publicString getUserName() {17 returnuserName;18 }19 public voidsetUserName(String userName) {20 this.userName =userName;21 }22
23 publicResume2 getResume1() {24 returnresume1;25 }26 public voidsetResume1(Resume2 resume1) {27 this.resume1 =resume1;28 }29 }
Users2.java
1 <?xml version="1.0"?>
2 "-//Hibernate/Hibernate Mapping DTD 3.0//EN"4 "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
5
6
7
8
9
10 resume1
11
12
13
14
15
16
17
18
Users2.hbm.xml
步骤二:配置文件Users2.hbm.xml和Resume2.hbm.xml
步骤三:测试方法书写
1 packagecn.happy.onetoone.pk;2
3 importorg.hibernate.Session;4 importorg.hibernate.Transaction;5 importorg.junit.Test;6
7 importcn.happy.util.HibernateUtil;8
9 public classTestone {10 /**
11 * 一对一 按主键映射12 **/
13 @Test14 public voidonetoont(){15 Session session =HibernateUtil.currentSession();16 Transaction tx =session.beginTransaction();17 Resume2 re=newResume2();18 re.setResName("学院不2");19 re.setResCardNo("2");20
21 Users2 use=newUsers2();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 @Test35 public voidselect(){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 packagecn.happy.zujian;2
3 public classEmpInfo {4 privateInteger eId;5 privateString eName;6 privateEmpHomeAddress eHome;7
8
9 publicInteger geteId() {10 returneId;11 }12 public voidseteId(Integer eId) {13 this.eId =eId;14 }15 publicString geteName() {16 returneName;17 }18 public voidseteName(String eName) {19 this.eName =eName;20 }21 publicEmpHomeAddress geteHome() {22 returneHome;23 }24 public voidseteHome(EmpHomeAddress eHome) {25 this.eHome =eHome;26 }27 }
EmpInfo.java
1 packagecn.happy.zujian;2
3 public classEmpHomeAddress {4 privateString ehomestreet;5 privateString ehomecity;6 privateString ehomeprovince;7 privateString ehomezipcode;8
9 privateEmpInfo empinfo;10 publicEmpInfo getEmpinfo() {11 returnempinfo;12 }13 public voidsetEmpinfo(EmpInfo empinfo) {14 this.empinfo =empinfo;15 }16 publicString getEhomestreet() {17 returnehomestreet;18 }19 public voidsetEhomestreet(String ehomestreet) {20 this.ehomestreet =ehomestreet;21 }22 publicString getEhomecity() {23 returnehomecity;24 }25 public voidsetEhomecity(String ehomecity) {26 this.ehomecity =ehomecity;27 }28 publicString getEhomeprovince() {29 returnehomeprovince;30 }31 public voidsetEhomeprovince(String ehomeprovince) {32 this.ehomeprovince =ehomeprovince;33 }34 publicString getEhomezipcode() {35 returnehomezipcode;36 }37 public voidsetEhomezipcode(String ehomezipcode) {38 this.ehomezipcode =ehomezipcode;39 }40
41 }
EmpHomeAddress
1 <?xml version="1.0"?>
2 "-//Hibernate/Hibernate Mapping DTD 3.0//EN"4 "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
5
6
7
8
9
10 STU_SID
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
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 @Test14 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 }
测试代码