一对一关联分为外键关联和主键关联:外键关联是指从表中存在主表的外键,这也是一种特殊的多对一关系;主键关联是指主从表的id一致

外键关联

主表:IDCard(校园卡)

从表:Student(学生)

学生类的定义和hbm文件的配置如下

1 public class Student {
2     private int id;
3     private String name;
4     //持有idcard的外键
5     private IDCard idCard;
6 } 

可以看到 学生持有校园卡外键的类结构和之前多对一关系中持有年级表外键的类结构是一样的,所以配置hbm的时候也可以看成学生和校园卡是多对一关系,只是多的一方现在只有一个而已

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <!DOCTYPE hibernate-mapping PUBLIC
 3         "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
 4         "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
 5 <hibernate-mapping >
 6     <class name="com.zlt.hibernatedemo.Student" table="student">
 7         <id name="id" column="id">
 8             <generator class="increment"></generator>
 9         </id>
10
11         <property name="name" type="java.lang.String">
12             <column name="name" length="50" />
13         </property>
14         <many-to-one name="idCard" column="idcardid" unique="true" cascade="all"></many-to-one>
15     </class>
16
17 </hibernate-mapping>

校园卡类的定义和hbm文件的配置如下

1 public class IDCard {
2     private int id;
3     private String num;
4     private Student student;
5 }

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <!DOCTYPE hibernate-mapping PUBLIC
 3         "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
 4         "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
 5 <hibernate-mapping >
 6     <class name="com.zlt.hibernatedemo.IDCard" table="idcard">
 7         <id name="id" column="id">
 8             <generator class="increment"></generator>
 9         </id>
10
11         <property name="num"></property>
12
13         <one-to-one name="student"></one-to-one>
14     </class>
15
16 </hibernate-mapping>

测试程序

 1 public class HibernateTest {
 2     public static void main(String[] args) {
 3         Session session = HibernateFactory.currentSession();
 4         Transaction tx = session.beginTransaction();
 5
 6
 7         Student student = new Student();
 8         student.setName("student");
 9
10         IDCard idCard = new IDCard();
11         idCard.setNum("109029055");
12
13         student.setIdCard(idCard);
14
15         //student配置了级联,存储了student也会把关联的idcard存储进去
16         session.save(student);
17 //        session.save(idCard);
18
19         tx.commit();
20         session.close();
21
22     }
23 }

结果

主键关联

学生

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <!DOCTYPE hibernate-mapping PUBLIC
 3         "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
 4         "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
 5 <hibernate-mapping >
 6     <class name="com.zlt.hibernatedemo.Student" table="student">
 7         <id name="id" column="id">
 8             <generator class="increment"></generator>
 9         </id>
10
11         <property name="name" type="java.lang.String">
12             <column name="name" length="50" />
13         </property>
14         <one-to-one name="idCard" cascade="all"></one-to-one>
15     </class>
16
17 </hibernate-mapping>

校园卡

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <!DOCTYPE hibernate-mapping PUBLIC
 3         "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
 4         "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
 5 <hibernate-mapping >
 6     <class name="com.zlt.hibernatedemo.IDCard" table="idcard">
 7         <id name="id" column="id">
 8             <generator class="foreign">
 9                 <param name="property">student</param>
10             </generator>
11         </id>
12
13         <property name="num"></property>
14
15          <!-- 若constrained=true,则表明存在外键与关联表对应,且关联表中肯定存在对应的键与其对应。-->
16         <one-to-one name="student" cascade="all" constrained="true"></one-to-one>
18     </class>
19
20 </hibernate-mapping>

测试程序

 1 public class HibernateTest {
 2     public static void main(String[] args) {
 3         Session session = HibernateFactory.currentSession();
 4         Transaction tx = session.beginTransaction();
 5
 6
 7         Student student = new Student();
 8         student.setName("student");
 9
10         IDCard idCard = new IDCard();
11         idCard.setNum("109029055");
12
13
14         //必须执行此语句
15         idCard.setStudent(student);
16
17         session.save(idCard);
18
19         tx.commit();
20         session.close();
21
22     }
23 }

结果

constrained(one-to-one):

constrained默认值为false

constrained只能在one-to-one的映射中使用,(一般在主表的映射中,有外键的那个表)。如果constrained=true 则表明存在外键与关联表对应,并且关联表中肯定存在对应的键与其对应, 另外该选项最关键的是影响save和delete的先后顺序。例如增加的时候,如果constainted=true,则会先增加关联表,然后增加本表。 删除的时候反之。

one-to-one的单向关联中,如果constrained=false,则会在查询时就全部取出来,用left outer join的方式。如果constrained=true,hibernate即会延迟加载sql,只把主表的查出来,等有用到关联表的再发sql取。

one-to- one的双向关联中,必须设置constrained=true,要不然会有重复数据读,如2个表user,car;在位false时sql 下:select * from user a left outer join car b on a.id=b.id left outer join on user c on a.id=c.id where a.id=? 删除的时候最好删除从表,删除主表会先查询下主表,在联合查询下

转载于:https://www.cnblogs.com/zanglitao/p/3817425.html

hibernate关系映射(一对一)相关推荐

  1. Hibernate关系映射 一对一双向外键关联@OneToOne Annotation方式

    首先还是来构造一个实际应用的场景,比如实体类车辆(Car),它具有以下属性:Id,品牌(brand),车牌(lisencePlate):实体类车牌(LisencePlate),它具有以下属性:Id,号 ...

  2. Hibernate关系映射

    Hibernate关系映射 Hibernate关系映射其实就是将关系模型中实体之间的三种关系--多对一(一对多).一对一.多对多映射成对象模型--Java这样的面向对象语言中相应的属性之间的关系. 多 ...

  3. 初识Hibernate——关系映射

    Hibernate的主要目的就是是Java程序员可以随心所欲的使用对象编程思维来操纵数据库.所以,一些数据库表的关系我们应该可以通过hibernate实现,比如在数据库中我们厂用的用到的主外键关系,还 ...

  4. Hibernate 关系映射

    第 1 章主要讲解了 Hibernate,它是一个开放源代码的对象关系映射框架.通过对JDBC 进行轻量级的对象封装,使 Java 程序员能够随心所欲地使用面向对象的编程思维来操作数据库.作为目前最杰 ...

  5. Hibernate关系映射和HQL

    1.单表映射:a.public class User { private Integer id; private String name; get/set} b.xml: <class name ...

  6. Mybatis中的关系映射(一对一,一对多,多对多)

    在网上寻了很久,大多数讲关系性的文章都是大篇幅的去将表照搬上来,本来就很生硬,此文就不在讲述关系性映射的具体实现,转而从浅层来讲讲其概念性. 1.1 关联关系概述 在关系型数据库中,多表之间存在着三种 ...

  7. Mybatis关系映射一对一的关系

    表结构: t_person表 个人表 t_idcard表 身份证表 身份证与个人一对一关联 实体映射类: @Data public class IdCard {private Integer id;p ...

  8. Hibernate 一对一关系映射总结篇

    在Hibernate 关系映射中一对一是比较常见也常用的一种,一对一的关系映射类型中又可分为:一对一外键单向映射.一对一外键双向映射.一对一主键单向映射和一对一主键双向映射. 下面就简单的说下自己对这 ...

  9. Hibernate对象关系映射详解之一对多关系映射

    Hibernate对象关系映射详解之"一对多"关系映射 之前学习Hibernate框架的时候,对这七大关系映射一直是云里雾里的,虽然可以仿照写出代码,但是不能独立编写出来.鉴于工作 ...

最新文章

  1. Python--strip()学习记录
  2. 用于软件包管理的21个Linux YUM命令 转载
  3. .GRIDVIEW奇偶行变色
  4. JZOJ__Day 9:【普及模拟】算法学习(sfxx)
  5. 程序员的能力矩阵表【转载自】
  6. vmware安装问题:Microsoft Runtime DLL安装程序未能完成安装
  7. 对话Pauly Comtois:赫斯特商业媒体中的企业DevOps采用
  8. Bailian4144 畜栏保留问题【贪心】
  9. 动态数组 —— 框架搭建
  10. Apache Http Server安全漏洞解决
  11. X1000对于camera控制部分的翻译
  12. matlab读取文件xlsfinfo,Matlab读写excel文件函数
  13. 小智机器人型号_小智类人型机器人
  14. Python学习日志--摆动吧!钟摆!
  15. git 更换仓库地址
  16. Oracle Cardinality Feedback
  17. 用Python对天气预报的数据进行数据分析
  18. 计算机保护系统软件,雨过天晴电脑保护系统专业版
  19. ug使用admas求解器方法
  20. 一张通往2030的“高铁票”:从无线网络到智能世界

热门文章

  1. Pixhawk代码分析-姿态解算篇B
  2. 常用七大经典排序算法总结(C语言描述)
  3. 《Linux内核设计与实现》读书笔记(五)- 系统调用
  4. 2263: neighbor(贪心)
  5. 二叉树的前中后序遍历之迭代法(非统一风格迭代方式)
  6. 手写 单隐藏层神经网络_反向传播(Matlab实现)
  7. android progressbar动态,如何在android中动态启动和完成progressBar
  8. dbcc dbreindex server sql_DBCC DBREINDEX重建索引提高SQL Server性能
  9. java.awt.headless 模式(Linux, java.awt.headless and the DISPLAY environment variable)
  10. JVM监控工具介绍jstack, jconsole, jinfo, jmap, jdb, jsta (Linux 如何查看进程的各线程的CPU占用 )