• 背景:

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

在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. c++趣味之难以发现的bug

    这些bug可能够你喝一壶的. 1.被断言(assert)包含的代码 常发生在切换到release版本时,执行结果乖乖的,最终查找结果是assert括号里的代码在release下是不执行的. 发现:跟踪 ...

  2. 标准mysql(x64) Windows版安装过程

    mysql x64不提供安装器,不提供安装器,不提供安装器-- 每次查英文文档有点慢,不够简. 5.7.6以后的64位zip包下载后解压是没有data目录的. 进入解压后的bin目录:(我用的powe ...

  3. centOS7安装nodejs(8.4.0)(详细步骤)

    1.使用rpm查看是否安装gcc.make 若如下图有输出版本详细表示已安装,则无需再次安装,直接下一步(输入rpm -qa 包名称) 若没有安装则执行以下命令安装:  yum install gcc ...

  4. 【jQuery】 JQ和AJAX

    AJAX AJAX全称异步 JavaScript 和 XML(Asynchronous JavaScript and XML),是一种用于网页前端和网站后台进行数据交互的手段.关于AJAX的详细介绍在 ...

  5. linux服务器中毒可疑进程sfewfesfs CPU80%

    我用的是wdlinux, 难免会有漏洞,不知怎么就被莫名其妙地给入侵了,而且还频繁发包.下面是我查看攻击机器的整个过程. 首先跟客户要了root密码登录看,第一个命令是就top cd /proc/25 ...

  6. 使用selenium时提示:ImportError:No module named selenium

    问题分析: 用的是mac系统,已经通过sudo pip install -U selenium安装好了selenium, 但是无论用命令行还是用sublime导入selenium都会提示错误. 于是查 ...

  7. Suricata 之IPS模式

    IPS 1.Suricata 本身是不具有拦截功能的,想要让它拦截包需要配合 iptables 使用. 首先要确定安装的suricata是否支持IPS模式,如果在安装编译的时候没有启用IPS模式,NF ...

  8. Beta冲刺链接总汇

    Beta冲刺 咸鱼 Beta 冲刺day1 Beta 冲刺day2 Beta 冲刺day3 Beta 冲刺day4 Beta 冲刺day5 Beta 冲刺day6 Beta 冲刺day7 凡事预则立- ...

  9. c语言的第三次---单程循环结构

    一.PTA实验作业 题目1 1.代码 int N,i; double height; //height代表身高 char sex; //代表男女性别 scanf("%d",& ...

  10. Django SNS 微博项目开发

    1.功能需求 一个人可以follow很多人 一个用户如果发了新weibo会自动推送所有关注他的人 可以搜索.关注其它用户 可以分类关注 用户可以发weibo, 转发.收藏.@其它人 发微博时可选择公开 ...