博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Hibernate(八):基于外键映射的1-1关联关系
阅读量:7010 次
发布时间:2019-06-28

本文共 8609 字,大约阅读时间需要 28 分钟。

  • 背景:

一个部门只有一个一把手,这在程序开发中就会设计数据映射应该设置为一对一关联。

在hibernate代码开发中,实现这个业务有两种方案:

1)基于外键映射的1-1关联;

2)基于主键映射的1-1关联。

本篇文章主要是用来学习如何使用外键实现1-1关联关系。

  • 新建项目hibernate05

新建java project,引入依赖包,在src下添加hibernate.cfg.xml

1 
2 5
6
7
root
8
123456
9
com.mysql.jdbc.Driver
10
jdbc:mysql://localhost/hibernate_01
11 12
14
org.hibernate.dialect.MySQL5InnoDBDialect
15 16
true
17 18
true
19 20
update
21 22
thread
23 24
500
25
20
26
10
27
2000
28
2000
29
10
30 31
32
33
34
35
36
View Code

在src下新建包com.dx.hibernate005.onetoonebyforigenkey

在com.dx.hibernate005.onetoonebyforigenkey包下创建

Deparment.java

1 package com.dx.hibernate005.onetoonebyforigenkey; 2  3 public class Deparment { 4     private Integer departId; 5     private String departName; 6     private Manager manager; 7  8     public Deparment() { 9         super();10     }11 12     public Deparment(Integer departId, String departName) {13         super();14         this.departId = departId;15         this.departName = departName;16     }17 18     public Integer getDepartId() {19         return departId;20     }21 22     public void setDepartId(Integer departId) {23         this.departId = departId;24     }25 26     public String getDepartName() {27         return departName;28     }29 30     public void setDepartName(String departName) {31         this.departName = departName;32     }33 34     public Manager getManager() {35         return manager;36     }37 38     public void setManager(Manager manager) {39         this.manager = manager;40     }41 42 }
View Code

Deparment.hbm.xml

1 
2 4
5
6
7
8
9
10
11
12
13
14 15
16
17
18

Manager.java

1 package com.dx.hibernate005.onetoonebyforigenkey; 2  3 public class Manager { 4     private Integer managerId; 5     private String managerName; 6     private Deparment deparment; 7  8     public Manager() { 9         super();10     }11 12     public Manager(Integer managerId, String managerName) {13         super();14         this.managerId = managerId;15         this.managerName = managerName;16     }17 18     public Integer getManagerId() {19         return managerId;20     }21 22     public void setManagerId(Integer managerId) {23         this.managerId = managerId;24     }25 26     public String getManagerName() {27         return managerName;28     }29 30     public void setManagerName(String managerName) {31         this.managerName = managerName;32     }33 34     public Deparment getDeparment() {35         return deparment;36     }37 38     public void setDeparment(Deparment deparment) {39         this.deparment = deparment;40     }41 42 }
View Code

Deparment.hbm.xml

1 
2 4
5
6
7
8
9
10
11
12
13
14 15
16
17
18

TestMain.java测试类,并引入JUnit4所需的依赖包。

package com.dx.hibernate005.onetoonebyforigenkey;import org.hibernate.Session;import org.hibernate.SessionFactory;import org.hibernate.Transaction;import org.hibernate.boot.Metadata;import org.hibernate.boot.MetadataSources;import org.hibernate.boot.model.naming.ImplicitNamingStrategyComponentPathImpl;import org.hibernate.boot.registry.StandardServiceRegistry;import org.hibernate.boot.registry.StandardServiceRegistryBuilder;import org.junit.After;import org.junit.Before;import org.junit.Test;public class TestMain {    private SessionFactory sessionFactory = null;    private Session session = null;    private Transaction transaction = null;    @Before    public void init() {        StandardServiceRegistry standardRegistry = new StandardServiceRegistryBuilder().configure().build();        Metadata metadata = new MetadataSources(standardRegistry).getMetadataBuilder().applyImplicitNamingStrategy(ImplicitNamingStrategyComponentPathImpl.INSTANCE).build();        sessionFactory = metadata.getSessionFactoryBuilder().build();        session = sessionFactory.getCurrentSession();        transaction = session.beginTransaction();    }        @After    public void destory() {        transaction.commit();        session.close();        sessionFactory.close();    }}

运行空测试类,初始化sql:

1 Hibernate:  2      3     create table DEPARMENTS ( 4        DEPART_ID integer not null auto_increment, 5         DEPART_NAME varchar(255), 6         MANAGER_ID integer, 7         primary key (DEPART_ID) 8     ) engine=InnoDB 9 Hibernate: 10     11     create table MANAGERS (12        MANAGER_ID integer not null auto_increment,13         MANAGER_NAME varchar(255),14         primary key (MANAGER_ID)15     ) engine=InnoDB16 Hibernate: 17     18     alter table DEPARMENTS 19        drop index UK_j9bdvgylyeboig73ntlfcuyf620 Hibernate: 21     22     alter table DEPARMENTS 23        add constraint UK_j9bdvgylyeboig73ntlfcuyf6 unique (MANAGER_ID)24 Hibernate: 25     26     alter table DEPARMENTS 27        add constraint FKnlmf88ii3maigw7hgc182cqi4 28        foreign key (MANAGER_ID) 29        references MANAGERS (MANAGER_ID)
View Code
  • 测试:

1)测试insert:

1     @Test 2     public void testInsert(){ 3         Deparment deparment=new Deparment(); 4         deparment.setDepartName("Depart1"); 5          6         Manager manager=new Manager(); 7         manager.setManagerName("manager1"); 8          9         deparment.setManager(manager);10         manager.setDeparment(deparment);11         12         session.save(manager);13         session.save(deparment);14     }15

测试通过,测试打印sql

1 Hibernate:  2     insert  3     into 4         MANAGERS 5         (MANAGER_NAME)  6     values 7         (?) 8 Hibernate:  9     insert 10     into11         DEPARMENTS12         (DEPART_NAME, MANAGER_ID) 13     values14         (?, ?)
View Code

2)测试select

1     @Test 2     public void testSelect() { 3         // 1.查询时,采用懒加载。 4         Deparment deparment = (Deparment) session.get(Deparment.class, 1); 5         System.out.println(deparment.getDepartName()); 6  7         // // 2.会出现懒加载异常问题 8         // session.close(); 9         // Manager manager = deparment.getManager();10         // System.out.println(manager.getClass());11         // System.out.println(manager.getManagerName());    12     }

3)测试Select Manager

1     @Test 2     public void testSelectManager() { 3         // 1.查询时,没采用懒加载。 4         Manager manager = session.get(Manager.class, 1); 5         System.out.println(manager.getManagerName()); 6          7         // 2.不会出现懒加载异常问题 8         session.close(); 9         System.out.println(manager.getDeparment().getDepartName());10     }

4)测试修改

1     @Test 2     public void testUpdate() { 3         // // 1) session关闭时,修改执行 4         // Manager manager = session.get(Manager.class, 1); 5         // manager.setManagerName("Mgr11111"); 6         // // session.save(manager); 7         // 8         // Deparment deparment = session.get(Deparment.class, 1); 9         // deparment.setDepartName("Depart111111");10         // // session.save(deparment);11 12         // // 2)通过manager 关联修改deparment13         // Manager manager = session.get(Manager.class, 1);14         // manager.setManagerName("Mgr222");15         // manager.getDeparment().setDepartName("DEPT22");16 17         // 3)通过department关联修改manager18         Deparment deparment = session.get(Deparment.class, 1);19         deparment.setDepartName("DPT333");20         deparment.getManager().setManagerName("Mgr333");21     }

5)测试删除

1     @Test 2     public void testDelete() { 3         // 1)在department表中有记录与之关联时,删除失败 4         // Manager manager = session.get(Manager.class, 1); 5         // session.delete(manager); 6  7         // 2)删除成功,只删除了deparment表中的记录,manger表中的记录并没有删除,之后再删除manager就不会出现错误。 8         Deparment deparment = session.get(Deparment.class, 1); 9         session.delete(deparment);10     }

 

转载地址:http://ujttl.baihongyu.com/

你可能感兴趣的文章
Linux服务器性能查看分析调优
查看>>
微信支付技术解决方案
查看>>
Vim 使用入门
查看>>
(原)centos7安装和使用greenplum4.3.12(详细版)
查看>>
深入学习Heritrix---解析CrawlController(转)
查看>>
HDU 6055 Regular polygon
查看>>
Hive之 hive与hadoop的联系
查看>>
linux和mac
查看>>
go 中的面向对象实现
查看>>
js 自定义弹窗方法
查看>>
Eclipse快捷键大全(转载)
查看>>
Install CentOS 7 on Thinkpad t430
查看>>
JavaScript中Date的一些细节
查看>>
趣味程序之趣味系列
查看>>
UVALive2389 ZOJ1078 Palindrom Numbers【回文+进制】
查看>>
ionic3使用echarts
查看>>
imuxsock lost 353 messages from pid 20261 due to rate-limiting 解决办法
查看>>
js如何调试,使用debug模式
查看>>
模仿黑魂锁定目标功能
查看>>
Android之Gson
查看>>