Hibernate5.2之一对一主键关联(四)

一.简介

  一对一关联关系分为两种:a.主键关联;b.外键关联。这两种关联关系在日常的开发中都比较的常用,本篇文章介绍主键关联,在下一篇文章中介绍外键关联。

二.主键关联

2.1 数据库的创建

create table cards (
id varchar2(255 char) not null,
card_num varchar2(255 char),
primary key (id)
); create table people (
id varchar2(255 char) not null,
name varchar2(255 char),
sex varchar2(255 char),
primary key (id)
);

2.2 hbm文件的方式

public class People {
private String id;
private String name;
private String sex;
private IdCard idCard;
//setter and getter
} public class IdCard {
private String id;
private String cardNum;
private People people;
//setter and getter
}

People.hbm.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping>
<class name="com.demo.hibernate.one2one.People" table="people">
<id name="id" type="string">
<generator class="uuid"></generator>
</id> <property name="name" type="string" column="name"></property>
<property name="sex" type="string" column="sex"></property>
<!-- fetch默认值为join的方式,采用左外连接的方式查询;当fetch=‘select’的时候,默认会发送两条SQL -->
<!-- 一对一的延迟加载的方式是将 constrained设置为true,然后将被延迟加载的一方的class中的lazy属性设置为true(默认值为true)-->
<one-to-one name="idCard" class="com.demo.hibernate.one2one.IdCard" cascade="all" fetch="select" constrained="true"></one-to-one>
</class>
</hibernate-mapping>

IdCard.hbm.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping>
<class name="com.demo.hibernate.one2one.IdCard" table="cards">
<id name="id" type="string" column="id">
<generator class="foreign">
<param name="property">people</param>
</generator>
</id> <property name="cardNum" type="string" column="card_num"></property>
<one-to-one name="people" class="com.demo.hibernate.one2one.People"></one-to-one>
</class>
</hibernate-mapping>

2.3 注解的方式

IdCard.java

@Entity
@Table(name="cards")
public class IdCard { @Id
@Column(name="id")
@GenericGenerator(name="foreignGenerator", strategy="foreign", parameters={@Parameter(value="people", name="property")})
@GeneratedValue(generator="foreignGenerator")
private String id; @Column(name="card_num")
private String cardNum; /**
* mappedBy="idCard",其中idCard为People类中的属性名
*/
@OneToOne(mappedBy="idCard", fetch=FetchType.LAZY)
private People people;
}

People.java

@Entity
@Table(name="people")
public class People { @Id
@Column(name="id")
@GenericGenerator(name="uuidGenerator", strategy="uuid")
@GeneratedValue(generator="uuidGenerator")
private String id; @Column(name="name")
private String name; @Column(name="sex")
private String sex; /**
* cascade表示级联的意思
* FetchMode.SELECT的方式表示,查询与之关联的数据的时候,使用select的方式,而不是左外连接,与在
* 在@OneToOne()中间加上fetch=FetchType.LAZY所表达出来的意思是一样的。
* @PrimaryKeyJoinColumn必须在生产主键的一方指定,不然会在被关联的一方多出一列
*/
@OneToOne(cascade=CascadeType.ALL)
@Fetch(value=FetchMode.SELECT)
@PrimaryKeyJoinColumn
private IdCard idCard;
}

2.4 代码测试

A.保存

@Test
public void save(){
Transaction tx = session.beginTransaction();
People people = new People();
people.setName("AAA");
people.setSex("男"); IdCard idCard = new IdCard();
idCard.setCardNum("889900");
idCard.setPeople(people); people.setIdCard(idCard);
session.save(people); tx.commit();
}

B.load

@Test
public void load(){
People people = session.load(People.class, "402882e65649c101015649c1031e0000");
System.out.println("此时没有发送任何的SQL语句");
System.out.println(people.getName() + "::" + people.getSex());
IdCard idCard = people.getIdCard();
System.out.println(idCard.getCardNum());
}

C.get

@Test
public void get(){
People people = session.get(People.class, "402882e65649c101015649c1031e0000");
System.out.println("此时已经发送了SQL语句");
System.out.println(people.getName() + "::" + people.getSex());
IdCard idCard = people.getIdCard();
System.out.println(idCard.getCardNum());
}

D.update

@Test
public void update(){
Transaction tx = session.beginTransaction();
People people = new People();
people.setId("402882e65649c92e015649c92fd90000");
people.setName("HHHNNN");
people.setSex("女");
session.update(people);
tx.commit();
}

E.delete

@Test
public void delete(){
People people = new People();
people.setId("402882e65649c101015649c1031e0000"); IdCard card = new IdCard();
card.setId("402882e65649c101015649c1031e0000"); people.setIdCard(card);
Transaction tx = session.beginTransaction();
session.delete(people);
tx.commit();
}

Hibernate5.2之一对一主键关联(四)的更多相关文章

  1. Hibernate5.2之一对一外键关联(五)

                                                     Hibernate5.2之一对一外键关联(五) 一.简介 上篇文章中笔者介绍了Hibernate关联关 ...

  2. Hibernate关联映射1:一对一主键关联

    2张表之间通过主键形成一对一映射关系,如一个人只能有一张身份证: t_identity_card表建表语句: CREATE TABLE `t_identity_card` ( `id` int(11) ...

  3. 010一对一 主键关联映射_双向(one-to-one)

    ²  两个对象之间是一对一的关系,如Person-IdCard(人—身份证号) ²  有两种策略可以实现一对一的关联映射 主键关联:即让两个对象具有相同的主键值,以表明它们之间的一一对应的关系:数据库 ...

  4. 009一对一 主键关联映射_单向(one-to-one)

    009一对一  主键关联映射_单向(one-to-one) ²  两个对象之间是一对一的关系,如Person-IdCard(人—身份证号) ²  有两种策略可以实现一对一的关联映射 主键关联:即让两个 ...

  5. Hibernate,关系映射的多对一单向关联、多对一双向关联、一对一主键关联、一对一外键关联、多对多关系关联

    2018-11-10  22:27:02开始写 下图内容ORM.Hibernate介绍.hibername.cfg.xml结构: 下图内容hibernate映射文件结构介绍 下图内容hibernate ...

  6. Hibernate注解:一对一主键关联

    情形:两个表,my_site和my_site_company,通过主键site_id唯一关联.my_site的主键是自动增加,my_site_company的主键依赖于my_site. # # Sou ...

  7. hibernate一对一主键双向关联

    关联是类(类的实例)之间的关系,表示有意义和值得关注的连接. 本系列将介绍Hibernate中主要的几种关联映射 Hibernate一对一主键单向关联Hibernate一对一主键双向关联Hiberna ...

  8. java:Hibernate框架2(关联映射(多对一,一对多,一对多双向,一对一主键,一对一唯一外键,多对多双向))

      hibernate.cfg.xml: <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE h ...

  9. hibernate一对一主键单向关联

    关联是类(类的实例)之间的关系,表示有意义和值得关注的连接. 本系列将介绍Hibernate中主要的几种关联映射 Hibernate一对一主键单向关联Hibernate一对一主键双向关联Hiberna ...

随机推荐

  1. Java(一)

    这个学期要学习七章的东西,目前我对第一章的内容掌握的还算良好,我学会了布局管理器,菜单栏,面板等一些组件的使用,但是对于事件监听器的使用还是有所欠缺.另外对于其他六章的内容都一无所知,之前也没有浏览过 ...

  2. Block对象

    背景:回调机制中回调设置代码和回调方法的具体实现无法写在同一段代码中.Mac OS X 10.6和iOS4种引入了Block对象.Block对象看上去是一段代码,但是可以当作数据来传递. 定义Bloc ...

  3. 黑马----JAVA异常

    黑马程序员:Java培训.Android培训.iOS培训..Net培训 黑马程序员--JAVA异常 一.JAVA异常有三种语句块:try语句块.catch语句块.finally语句块. 1.try语句 ...

  4. win7系统下的FTP配置

    2016-07-12 工作中需要在win7操作系统下配置FTP,遇到许多问题,所以记录下来方便以后解决问题. FTP是文件传输协议的简称.用于Internet上的控制文件的双向传输.同时,它也是一个应 ...

  5. ABAP 生产订单的创建与修改函数

    ABAP 生产订单的创建与修改函数转自http://www.cnblogs.com/aBaoRong/archive/2012/04/11/2441946.html   如果生产订单过多,可以批量创建 ...

  6. ORACLE执行详解

    本文源自TTT BLOG,原文地址:http://blog.chinaunix.net/u3/107265/showart_2192657.html 简介:     本文全面详细介绍oracle执行计 ...

  7. 转载《SimpleAdapter的参数说明》

    SimpleAdapter的参数说明 第一个参数 表示访问整个android应用程序接口,基本上所有的组件都需要 第二个参数表示生成一个Map(String ,Object)列表选项 第三个参数表示界 ...

  8. Android之ScrollView嵌套ListView和GridView冲突

    由于ListView,GridView本身都继承于ScrollView,一旦在ScrollView中嵌套ScrollView, 在ScrollView中嵌套使用ListView或者GridView,L ...

  9. SHOI 2009 会场预约 平衡树 STL练习

    题目描述 PP大厦有一间空的礼堂,可以为企业或者单位提供会议场地.这些会议中的大多数都需要连续几天的时间(个别的可能只需要一天),不过场地只有一个,所以不同的会议的时间申请不能够冲突.也就是说,前一个 ...

  10. Unity全视角游戏的键盘操作位移——研究笔记

    using UnityEngine; using System.Collections; public class MoveCeShi : MonoBehaviour { ; private Char ...