hibernate mysql 主外键_Hibernate中映射一对一关联(按主键映射和外键映射)和组件映射...

Hibernate中映射一对一关联(按主键映射和外键映射)和组件映射

Hibernate提供了两种映射一对一关联关系的方式:按照外键映射和按照主键映射。

下面以员工账号和员工档案表为例,介绍这两种映射方式,并使用这两种映射方式分别完成以下持久化操作:

(1)保存员工档案的同时分配给员工一个账号。

(2)加载员工档案的同时加载账号信息。

1.按照外键映射

c98f382a1f6b33dad0f72fb2f538ec4c.png

步骤一:创建实体类Users1和Resume1

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

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

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

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

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

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

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

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

efc223d5f8c2e08aae222112dc8fa5ff.png

7e484b158828d7fba1888ee3851b0dc8.png

步骤三:测试方法书写

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

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 }

测试

二:按照主键映射

ae68d3f94c3a24620f94c09be4dbd518.png

步骤一:创建实体类Users2和Resume2

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

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

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

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

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

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

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

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

ff7ae1236f02e9a8936feaa4c61c6ab0.png

706c4578be760f683dbffcc9df622d63.png

步骤三:测试方法书写

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

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中

6f26f897690600a47e89a3e5edb0556d.png

步骤一:创建EmpHomeAddress和EmpInfo

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

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

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

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

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

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

ea0fb33d9b2cb418e9cb139c6124bc6c.png

步骤三:书写测试类

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

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 }

测试代码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值