Hibernate5.2之一对一主键关联(四)
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之一对一主键关联(四)的更多相关文章
- Hibernate5.2之一对一外键关联(五)
Hibernate5.2之一对一外键关联(五) 一.简介 上篇文章中笔者介绍了Hibernate关联关 ...
- Hibernate关联映射1:一对一主键关联
2张表之间通过主键形成一对一映射关系,如一个人只能有一张身份证: t_identity_card表建表语句: CREATE TABLE `t_identity_card` ( `id` int(11) ...
- 010一对一 主键关联映射_双向(one-to-one)
² 两个对象之间是一对一的关系,如Person-IdCard(人—身份证号) ² 有两种策略可以实现一对一的关联映射 主键关联:即让两个对象具有相同的主键值,以表明它们之间的一一对应的关系:数据库 ...
- 009一对一 主键关联映射_单向(one-to-one)
009一对一 主键关联映射_单向(one-to-one) ² 两个对象之间是一对一的关系,如Person-IdCard(人—身份证号) ² 有两种策略可以实现一对一的关联映射 主键关联:即让两个 ...
- Hibernate,关系映射的多对一单向关联、多对一双向关联、一对一主键关联、一对一外键关联、多对多关系关联
2018-11-10 22:27:02开始写 下图内容ORM.Hibernate介绍.hibername.cfg.xml结构: 下图内容hibernate映射文件结构介绍 下图内容hibernate ...
- Hibernate注解:一对一主键关联
情形:两个表,my_site和my_site_company,通过主键site_id唯一关联.my_site的主键是自动增加,my_site_company的主键依赖于my_site. # # Sou ...
- hibernate一对一主键双向关联
关联是类(类的实例)之间的关系,表示有意义和值得关注的连接. 本系列将介绍Hibernate中主要的几种关联映射 Hibernate一对一主键单向关联Hibernate一对一主键双向关联Hiberna ...
- java:Hibernate框架2(关联映射(多对一,一对多,一对多双向,一对一主键,一对一唯一外键,多对多双向))
hibernate.cfg.xml: <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE h ...
- hibernate一对一主键单向关联
关联是类(类的实例)之间的关系,表示有意义和值得关注的连接. 本系列将介绍Hibernate中主要的几种关联映射 Hibernate一对一主键单向关联Hibernate一对一主键双向关联Hiberna ...
随机推荐
- ES5 对数组方法的扩展 以及 正则表达式
ES5 对数组的扩展 forEach map some every indexOf lastIndexOf forEach 与 map 语法: 数组.forEach(function ( v, i ) ...
- codeforces 731C(DFS)
题目链接:http://codeforces.com/contest/731/problem/C 题意:有n只袜子(1~n),k种颜色(1~k),在m天中,左脚穿下标为l,右脚穿下标为r的袜子,问最少 ...
- struts2 配置拦截器
第一步:继承MethodFilterInterceptor写自己的自定义拦截器 import org.apache.struts2.ServletActionContext; import com.o ...
- Memcache学习笔记
以下内容大部分来自网络,小部分是本人遇到的问题融合后的记录. 先贴一段涨姿势~ Memcache是什么 Memcache是danga.com的一个项目,最早是为 LiveJournal 服务的,目前全 ...
- c语言结构体&常指针和常量指针的区别
结构体: 关系密切但数据类型不尽相同, 常指针和常量指针的区别: char * const cp : 定义一个指向字符的指针常数,即const指针,常指针. const char* p : 定义一个指 ...
- Installshield调用DLL的正确姿势
脚本如下 szDllPath = SUPPORTDIR ^ "TestCom.dll"; set oMyTest = CoCreateObjectDotNet(szDl ...
- PHP代码实用片段
一.黑名单过滤 function is_spam($text, $file, $split = ':', $regex = false){ $handle = fopen($file, 'rb'); ...
- web服务器软件集成包问题
今天下了wampserver,运行错误缺少dll,然后下载apprev也是,最后下了个wampserver 32位了终于没问题了.
- HDU-2825 Wireless Password(AC自动机+状压DP)
题目大意:给一系列字符串,用小写字母构造出长度为n的至少包含k个字符串的字符串,求能构造出的个数. 题目分析:在AC自动机上走n步,至少经过k个单词节点,求有多少种走法. 代码如下: # includ ...
- dfs序
dfs序比较重要的性质:一棵子树的所有节点在dfs序里是连续一段,主要就是利用这个性质来解题 题型一:对某个点X权值加上一个数W,查询某个子树X里所有点权值和. 解:列出dfs序,实现修改一个数,查询 ...