• 背景:

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

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

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

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

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

  • 新建项目hibernate05

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

 <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">123456</property>
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost/hibernate_01</property> <!-- <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="hibernate.dialect">org.hibernate.dialect.MySQLInnoDBDialect</property> -->
<property name="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property> <property name="hibernate.show_sql">true</property> <property name="hibernate.format_sql">true</property> <property name="hibernate.hbm2ddl.auto">update</property> <property name="hibernate.current_session_context_class">thread</property> <property name="hibernate.c3p0.max_size">500</property>
<property name="hibernate.c3p0.min_size">20</property>
<property name="hibernate.c3p0.max_statements">10</property>
<property name="hibernate.c3p0.timeout">2000</property>
<property name="hibernate.c3p0.idle_test_period">2000</property>
<property name="hibernate.c3p0.acquire_increment">10</property> <mapping resource="com/dx/hibernate005/onetoonebyforigenkey/Deparment.hbm.xml" />
<mapping class="com.dx.hibernate005.onetoonebyforigenkey.Deparment" />
<mapping resource="com/dx/hibernate005/onetoonebyforigenkey/Manager.hbm.xml" />
<mapping class="com.dx.hibernate005.onetoonebyforigenkey.Manager" />
</session-factory>
</hibernate-configuration>

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

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

Deparment.java

 package com.dx.hibernate005.onetoonebyforigenkey;

 public class Deparment {
private Integer departId;
private String departName;
private Manager manager; public Deparment() {
super();
} public Deparment(Integer departId, String departName) {
super();
this.departId = departId;
this.departName = departName;
} public Integer getDepartId() {
return departId;
} public void setDepartId(Integer departId) {
this.departId = departId;
} public String getDepartName() {
return departName;
} public void setDepartName(String departName) {
this.departName = departName;
} public Manager getManager() {
return manager;
} public void setManager(Manager manager) {
this.manager = manager;
} }

Deparment.hbm.xml

 <?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 2017-6-2 10:54:26 by Hibernate Tools 3.5.0.Final -->
<hibernate-mapping>
<class name="com.dx.hibernate005.onetoonebyforigenkey.Deparment" table="DEPARMENTS">
<id name="departId" type="java.lang.Integer">
<column name="DEPART_ID" />
<generator class="native" />
</id>
<property name="departName" type="java.lang.String">
<column name="DEPART_NAME" />
</property> <!-- 在Deparment中定义一个Many-to-one就可以实现在Deparments表中多一个外键列 -->
<many-to-one name="manager" class="com.dx.hibernate005.onetoonebyforigenkey.Manager" column="MANAGER_ID" unique="true"></many-to-one>
</class>
</hibernate-mapping>

Manager.java

 package com.dx.hibernate005.onetoonebyforigenkey;

 public class Manager {
private Integer managerId;
private String managerName;
private Deparment deparment; public Manager() {
super();
} public Manager(Integer managerId, String managerName) {
super();
this.managerId = managerId;
this.managerName = managerName;
} public Integer getManagerId() {
return managerId;
} public void setManagerId(Integer managerId) {
this.managerId = managerId;
} public String getManagerName() {
return managerName;
} public void setManagerName(String managerName) {
this.managerName = managerName;
} public Deparment getDeparment() {
return deparment;
} public void setDeparment(Deparment deparment) {
this.deparment = deparment;
} }

Deparment.hbm.xml

 <?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 2017-6-2 10:54:26 by Hibernate Tools 3.5.0.Final -->
<hibernate-mapping>
<class name="com.dx.hibernate005.onetoonebyforigenkey.Manager" table="MANAGERS">
<id name="managerId" type="java.lang.Integer">
<column name="MANAGER_ID" />
<generator class="native" />
</id>
<property name="managerName" type="java.lang.String">
<column name="MANAGER_NAME" />
</property> <!-- 在对应的数据表中已经有了外键,当前持久化类使用one-to-one进行映射 -->
<one-to-one name="deparment" class="com.dx.hibernate005.onetoonebyforigenkey.Deparment" property-ref="manager"></one-to-one>
</class>
</hibernate-mapping>

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:

 Hibernate: 

     create table DEPARMENTS (
DEPART_ID integer not null auto_increment,
DEPART_NAME varchar(255),
MANAGER_ID integer,
primary key (DEPART_ID)
) engine=InnoDB
Hibernate: create table MANAGERS (
MANAGER_ID integer not null auto_increment,
MANAGER_NAME varchar(255),
primary key (MANAGER_ID)
) engine=InnoDB
Hibernate: alter table DEPARMENTS
drop index UK_j9bdvgylyeboig73ntlfcuyf6
Hibernate: alter table DEPARMENTS
add constraint UK_j9bdvgylyeboig73ntlfcuyf6 unique (MANAGER_ID)
Hibernate: alter table DEPARMENTS
add constraint FKnlmf88ii3maigw7hgc182cqi4
foreign key (MANAGER_ID)
references MANAGERS (MANAGER_ID)
  • 测试:

1)测试insert:

     @Test
public void testInsert(){
Deparment deparment=new Deparment();
deparment.setDepartName("Depart1"); Manager manager=new Manager();
manager.setManagerName("manager1"); deparment.setManager(manager);
manager.setDeparment(deparment); session.save(manager);
session.save(deparment);
}

测试通过,测试打印sql

 Hibernate:
insert
into
MANAGERS
(MANAGER_NAME)
values
(?)
Hibernate:
insert
into
DEPARMENTS
(DEPART_NAME, MANAGER_ID)
values
(?, ?)

2)测试select

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

3)测试Select Manager

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

4)测试修改

     @Test
public void testUpdate() {
// // 1) session关闭时,修改执行
// Manager manager = session.get(Manager.class, 1);
// manager.setManagerName("Mgr11111");
// // session.save(manager);
//
// Deparment deparment = session.get(Deparment.class, 1);
// deparment.setDepartName("Depart111111");
// // session.save(deparment); // // 2)通过manager 关联修改deparment
// Manager manager = session.get(Manager.class, 1);
// manager.setManagerName("Mgr222");
// manager.getDeparment().setDepartName("DEPT22"); // 3)通过department关联修改manager
Deparment deparment = session.get(Deparment.class, 1);
deparment.setDepartName("DPT333");
deparment.getManager().setManagerName("Mgr333");
}

5)测试删除

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

Hibernate(八):基于外键映射的1-1关联关系的更多相关文章

  1. Hibernate之基于外键映射的一对一(1-1)关联关系

    1.对于基于外键的1-1关联,其外键可以存放在任意一边,在需要存放外键一端,增加many-to-one元素.为many-to-one元素增加unique="true"属性来表示为1 ...

  2. hibernate中基于主键映射1-1关联关系和基于外键映射1-1关联关系的不同

    基于主键映射1-1关联关系和基于外键映射1-1关联关系的不同,主要区别是在配置映射文件上会有区别 两个持久化类为Manager和Department 1:基于主键映射1-1关联关系 1)使用其他持久化 ...

  3. hibernate笔记--基于外键的单(双)向的一对一映射关系

    假设我们有两张表,人员信息表Person,和身份信息表IdCard,我们知道每个人只有一个身份证号,所以这里的Person和IdCard表是一一对应的,也就是一对一的映射关系,基于外键的单向一对一映射 ...

  4. java之hibernate之基于外键的双向一对一关联映射

    这篇讲解 基于外键的双向一对一关联映射 1.考察如下信息,人和身份证之间是一个一对一的关系.表的设计 2.类结构 Person.java public class Person implements ...

  5. java之hibernate之基于外键的一对一单向关联映射

    这篇讲解基于外键的一对一单向关联映射 1.考察如下信息,人和身份证之间是一个一对一的关系.表的设计 注意:基于外键的一对一关联的表结构和多对一的表结构是一致的,但是,外键是唯一的. 2.类的结构 Pe ...

  6. Hibernate 基于外键映射的一对一关联关系随手记

    //有外键的一端默认使用懒加载. //没有外键的一端不使用懒加载,而是直接将它引用的对象也一并查询出来. //没有外键列不仅有外键约束还有唯一约束,即没有外键列一端的对象不能被有外键列一端的两个对象同 ...

  7. Hibernate之基于主键映射的一对一关联关系

    1. 基于主键的映射策略:指一端的主键生成器使用foreign策略,表明根据"对方"的主键来生成自己的主键,自己并不能独立生成主键.并用<param> 子元素指定使用当 ...

  8. Hibernate学习(二)关系映射----基于外键的单向一对一

    事实上,单向1-1与N-1的实质是相同的,1-1是N-1的特例,单向1-1与N-1的映射配置也非常相似.只需要将原来的many-to-one元素增加unique="true"属性, ...

  9. Hibernate关系映射(二) 基于外键的双向一对一

    基于外键的双向一对一关联映射 需要在一端添加<one-to-one>标签,用property-ref来指定反向属性引用. 还是通过刚才用户和地址来演示双向一对一关联. 代码演示 一.实体类 ...

随机推荐

  1. 2017总结&2018展望

    2017已逝2018已来,是时候放下包袱来好好回顾下2017做了什么,有什么收获,遗憾之处的原因是什么.2018应该怎么做才能让自己满意,才能少一些遗憾. 2017 工作 工作中所参与的项目是一个直播 ...

  2. 元组tuple基本操作

    创建一个元组 tuple1=(1,2,3,4,5,6,7,8) tuple的标志仿佛是(),但是,有()不一定是元组,没有()不一定不是元组 tuple2=(1)#tuple2是一个整型 tuple3 ...

  3. 【Python】 文件目录比较工具filecmp和difflib

    在一些运维场景中,常常需要比较两个环境中的应用目录结构(是否有文件/目录层面上的增删)以及比较两个环境中同名文件内容的不同(即文件层面上的改).Python自带了两个内建模块可以很好地完成这个工作,f ...

  4. 【Zabbix】 ZBX的豆知识

    ZBX ZBX虽然看上去是个很庞大的系统,但是相对架构还是比较简单的,而且我接触比较长时间了,很多东西觉得没有什么记的必要,所以以这种零碎的形式来记录一些小知识点. ■ ZBX用户权限问题 ZBX用户 ...

  5. C语言操作符/表达式及其作用总结

    一.算术操作符:+ - * / % 1. 除了 %操作符之外,其他的 几个操作符可以作 用于整数和浮点数. 2. 对于"/"操作符如果两个操作数都为整数,执行整数除法.而只要有浮点 ...

  6. Android学习链接大放送

    虽然贴链接这种事情..真是一种很偷懒的做法... 但是我一个小菜鸟,果断还是要以多向别人学习为主... 好资源要和大家分享对不对! 况且..放博客里..比收藏夹的利用几率要大一点! 原作者应该也很喜欢 ...

  7. [BZOJ 2064]分裂

    2064: 分裂 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 572  Solved: 352[Submit][Status][Discuss] De ...

  8. Java基础学习笔记九 Java基础语法之this和super

    构造方法 我们对封装已经有了基本的了解,接下来我们来看一个新的问题,依然以Person为例,由于Person中的属性都被private了,外界无法直接访问属性,必须对外提供相应的set和get方法.当 ...

  9. C语言博客作业--一二维数组。

    一.PTA实验作业 题目1:7-1 将数组中的数逆序存放 1. 本题PTA提交列表 2. 设计思路 定义三个整型变量n用来存放整数个数i,j是循环数 scanf("%d",& ...

  10. C语言博客作业--字符数组

    一.PTA实验作业 题目1:统计一行文本的单词个数 1. 本题PTA提交列表 2. 设计思路 Begin 定义字符型变量ch,pre=' ': 定义整型变量count://用来记录单词个数 count ...