- 背景:
一个部门只有一个一把手,这在程序开发中就会设计数据映射应该设置为一对一关联。
在hibernate代码开发中,实现这个业务有两种方案:
1)基于外键映射的1-1关联;
2)基于主键映射的1-1关联。
本篇文章主要是用来学习如何使用外键实现1-1关联关系。
- 新建项目hibernate05
新建java project,引入依赖包,在src下添加hibernate.cfg.xml
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
![](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
1 2 56 7 36root 8123456 9com.mysql.jdbc.Driver 10jdbc:mysql://localhost/hibernate_01 11 12 14org.hibernate.dialect.MySQL5InnoDBDialect 15 16true 17 18true 19 20update 21 22thread 23 24500 2520 2610 272000 282000 2910 30 3132 33 34 35
在src下新建包com.dx.hibernate005.onetoonebyforigenkey
在com.dx.hibernate005.onetoonebyforigenkey包下创建
Deparment.java
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
![](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
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 }
Deparment.hbm.xml
1 2 4 56 7 188 119 10 12 14 15 1613 17
Manager.java
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
![](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
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 }
Deparment.hbm.xml
1 2 4 56 7 188 119 10 12 14 15 1613 17
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:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
![](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
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)
- 测试:
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
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
![](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
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 (?, ?)
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 }