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

一.简介

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

二.主键关联

2.1 数据库的创建

  1. create table cards (
  2. id varchar2(255 char) not null,
  3. card_num varchar2(255 char),
  4. primary key (id)
  5. );
  6.  
  7. create table people (
  8. id varchar2(255 char) not null,
  9. name varchar2(255 char),
  10. sex varchar2(255 char),
  11. primary key (id)
  12. );

2.2 hbm文件的方式

  1. public class People {
  2. private String id;
  3. private String name;
  4. private String sex;
  5. private IdCard idCard;
  6. //setter and getter
  7. }
  8.  
  9. public class IdCard {
  10. private String id;
  11. private String cardNum;
  12. private People people;
  13. //setter and getter
  14. }

People.hbm.xml

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

IdCard.hbm.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE hibernate-mapping PUBLIC
  3. "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
  4. "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
  5.  
  6. <hibernate-mapping>
  7. <class name="com.demo.hibernate.one2one.IdCard" table="cards">
  8. <id name="id" type="string" column="id">
  9. <generator class="foreign">
  10. <param name="property">people</param>
  11. </generator>
  12. </id>
  13.  
  14. <property name="cardNum" type="string" column="card_num"></property>
  15. <one-to-one name="people" class="com.demo.hibernate.one2one.People"></one-to-one>
  16. </class>
  17. </hibernate-mapping>

2.3 注解的方式

IdCard.java

  1. @Entity
  2. @Table(name="cards")
  3. public class IdCard {
  4.  
  5. @Id
  6. @Column(name="id")
  7. @GenericGenerator(name="foreignGenerator", strategy="foreign", parameters={@Parameter(value="people", name="property")})
  8. @GeneratedValue(generator="foreignGenerator")
  9. private String id;
  10.  
  11. @Column(name="card_num")
  12. private String cardNum;
  13.  
  14. /**
  15. * mappedBy="idCard",其中idCard为People类中的属性名
  16. */
  17. @OneToOne(mappedBy="idCard", fetch=FetchType.LAZY)
  18. private People people;
  19. }

People.java

  1. @Entity
  2. @Table(name="people")
  3. public class People {
  4.  
  5. @Id
  6. @Column(name="id")
  7. @GenericGenerator(name="uuidGenerator", strategy="uuid")
  8. @GeneratedValue(generator="uuidGenerator")
  9. private String id;
  10.  
  11. @Column(name="name")
  12. private String name;
  13.  
  14. @Column(name="sex")
  15. private String sex;
  16.  
  17. /**
  18. * cascade表示级联的意思
  19. * FetchMode.SELECT的方式表示,查询与之关联的数据的时候,使用select的方式,而不是左外连接,与在
  20. * 在@OneToOne()中间加上fetch=FetchType.LAZY所表达出来的意思是一样的。
  21. * @PrimaryKeyJoinColumn必须在生产主键的一方指定,不然会在被关联的一方多出一列
  22. */
  23. @OneToOne(cascade=CascadeType.ALL)
  24. @Fetch(value=FetchMode.SELECT)
  25. @PrimaryKeyJoinColumn
  26. private IdCard idCard;
  27. }

2.4 代码测试

A.保存

  1. @Test
  2. public void save(){
  3. Transaction tx = session.beginTransaction();
  4. People people = new People();
  5. people.setName("AAA");
  6. people.setSex("男");
  7.  
  8. IdCard idCard = new IdCard();
  9. idCard.setCardNum("889900");
  10. idCard.setPeople(people);
  11.  
  12. people.setIdCard(idCard);
  13. session.save(people);
  14.  
  15. tx.commit();
  16. }

B.load

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

C.get

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

D.update

  1. @Test
  2. public void update(){
  3. Transaction tx = session.beginTransaction();
  4. People people = new People();
  5. people.setId("402882e65649c92e015649c92fd90000");
  6. people.setName("HHHNNN");
  7. people.setSex("女");
  8. session.update(people);
  9. tx.commit();
  10. }

E.delete

  1. @Test
  2. public void delete(){
  3. People people = new People();
  4. people.setId("402882e65649c101015649c1031e0000");
  5.  
  6. IdCard card = new IdCard();
  7. card.setId("402882e65649c101015649c1031e0000");
  8.  
  9. people.setIdCard(card);
  10. Transaction tx = session.beginTransaction();
  11. session.delete(people);
  12. tx.commit();
  13. }

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. ES5 对数组方法的扩展 以及 正则表达式

    ES5 对数组的扩展 forEach map some every indexOf lastIndexOf forEach 与 map 语法: 数组.forEach(function ( v, i ) ...

  2. codeforces 731C(DFS)

    题目链接:http://codeforces.com/contest/731/problem/C 题意:有n只袜子(1~n),k种颜色(1~k),在m天中,左脚穿下标为l,右脚穿下标为r的袜子,问最少 ...

  3. struts2 配置拦截器

    第一步:继承MethodFilterInterceptor写自己的自定义拦截器 import org.apache.struts2.ServletActionContext; import com.o ...

  4. Memcache学习笔记

    以下内容大部分来自网络,小部分是本人遇到的问题融合后的记录. 先贴一段涨姿势~ Memcache是什么 Memcache是danga.com的一个项目,最早是为 LiveJournal 服务的,目前全 ...

  5. c语言结构体&常指针和常量指针的区别

    结构体: 关系密切但数据类型不尽相同, 常指针和常量指针的区别: char * const cp : 定义一个指向字符的指针常数,即const指针,常指针. const char* p : 定义一个指 ...

  6. Installshield调用DLL的正确姿势

    脚本如下 szDllPath = SUPPORTDIR ^ "TestCom.dll";       set oMyTest = CoCreateObjectDotNet(szDl ...

  7. PHP代码实用片段

    一.黑名单过滤 function is_spam($text, $file, $split = ':', $regex = false){ $handle = fopen($file, 'rb'); ...

  8. web服务器软件集成包问题

    今天下了wampserver,运行错误缺少dll,然后下载apprev也是,最后下了个wampserver 32位了终于没问题了.

  9. HDU-2825 Wireless Password(AC自动机+状压DP)

    题目大意:给一系列字符串,用小写字母构造出长度为n的至少包含k个字符串的字符串,求能构造出的个数. 题目分析:在AC自动机上走n步,至少经过k个单词节点,求有多少种走法. 代码如下: # includ ...

  10. dfs序

    dfs序比较重要的性质:一棵子树的所有节点在dfs序里是连续一段,主要就是利用这个性质来解题 题型一:对某个点X权值加上一个数W,查询某个子树X里所有点权值和. 解:列出dfs序,实现修改一个数,查询 ...