啊讲道理放假这十天不到啊

感觉生活中充满了绝望 这就又开学了

好吧好吧继续学习笔记?还是什么的

一对一关联映射

这次我们仍然准备了两个表

一个是用户表Users

一个是档案表Resume

他们的关系是一对一(一个用户只能有一份档案 一份档案只能属于一个永固)

我们无需建表,Hibernate会检查数据库中有没有对应的表,如果没有,自动生成

我们也可以用来看自动生成的表是什么样子的

一对一外键映射FK

那么接下来是小配置文件

user的小配置文件

  1. <one-to-one name="resume" class="Resume" property-ref="user"></one-to-one>

name属性是小配置关联的实体类中 存放的另一个实体的对象的名称

Class当然是一对一关系中对应的实体类

那么Users这个实体类结构如下

property-ref 改变有关联关系对象的列的等值对比
默认:A表主键默认关联B表主键
设置后是让A表的主键关联B表的非主键列

resume的小配置文件

  1. <many-to-one name="users" class="Users" columm="uid" unique="true" cascade="all"></many-to-one>

column 关联的主键列(相当于档案表是外检表,用户表是主表)

unique 唯一的 保证了一对一的关系

Resume实体类如下

编写测试类。

  1. @Before
  2. public void before() {
  3. session = HibernateUtil.currentSession();
  4. tx = session.beginTransaction();
  5. }
  6.  
  7. @After
  8. public void after() {
  9. tx.commit();
  10. HibernateUtil.closeSession();
  11. }
  12.  
  13. @Test
  14. public void insert() {
  15. Resume resume = new Resume();
  16. resume.setResname("斯沃的机密档案");
  17.  
  18. Users user = new Users();
  19. user.setUname("斯沃");
  20.  
  21. resume.setUser(user);
  22. user.setResume(resume);
  23.  
  24. session.save(resume);
  25. }

运行成功后我们来看看自动生成的表的结构

User用户表里只有我们的编号和姓名两列

而在档案表里除了编号和档案名称

  还多出了一列 用户id

一对一外键映射相当于一个一对多的关联映射,但是加上了一个唯一约束使得一个User只能对应一个档案

(否则多个档案的Userid列会可以指向同一个User)

一对一主键映射PK

然后呢是一对一主键映射

我比较懒 因为已经提前知道一对一外键映射和逐渐映射

自动生成的表的表结构是不一样的

可是我比较不想举一个新的例子 所以仍用用户和档案的例子

为了避免重复,我们在小配置中让他们关联的表名变化

这次是Users2表和Resume2表(虽然实体类的名称没有变)

那么实体类是没有变化的

我们直接来看小配置

先看档案的

  1. <one-to-one name="user" class="Users" cascade="all"></one-to-one>

没有什么可以说的样子

看Users用户的

哦对了在这里突然想到 为什么用户表叫Users而不是User 关键字的问题

  1. <one-to-one name="resume" class="Resume" constrained="true"></one-to-one>

constrained 约束用户表中出现的档案列必须在主表档案表中出现过

另外一点 就是Users表的主键生成策略

  1. <id name="userid" type="java.lang.Integer">
  2. <!--主键生成策略-->
  3. <generator class="foreign">
  4. <param name="property">resume</param>
  5. </generator>
  6. </id>

这里使用的主键生成策略是foreign 关联到的是表RESUME

也就是两个表的对应的记录的主键会相同

所以在查询的时候只需要查询一个主键就可以把它们关联起来

测试类的代码如下

  1. @Before
  2. public void before() {
  3. session = HibernateUtil.currentSession();
  4. tx = session.beginTransaction();
  5. }
  6.  
  7. @After
  8. public void after() {
  9. tx.commit();
  10. HibernateUtil.closeSession();
  11. }
  12.  
  13. @Test
  14. public void insert() {
  15. Resume resume = new Resume();
  16. resume.setResname("斯沃的机密档案");
  17.  
  18. Users user = new Users();
  19. user.setUname("斯沃");
  20.  
  21. resume.setUser(user);
  22. user.setResume(resume);
  23.  
  24. session.save(user);
  25. }

等等 为啥感觉区别不大= =

不要在意细节 看看结果是怎么样的

果然如我所说= =

组件映射

那么接下来是组件映射

组件映射就是两个实体类 一对一的关系

或者说其实一个实体类是另一个实体类的扩展

我们举的例子是一个 People 人 和一个PeopleInfo 人的信息

其中人保存的是人的编号pid 名字pname 和 对应的人的信息这个实体类

我们看一下两个实体类

噢我们只需要一个小配置文件 就是People的小配置文件

那么需要怎么写。。。

  1. <class name="People" table="PEOPLE">
  2. <id name="pid" type="java.lang.Integer">
  3. <!--主键生成策略-->
  4. <generator class="native"/>
  5. </id>
  6. <property name="pname" type="string"/>
  7.  
  8. <component name="info" class="PeopleInfo">
  9. <parent name="people"/>
  10. <property name="address"></property>
  11. <property name="phone"></property>
  12. </component>
  13. </class>

在class节点中

使用一个component节点 关联着另一个类

然后 就 可以使用 了

  1. @Test
  2. public void insert() {
  3. People people=new People();
  4. people.setPname("天命");
  5.  
  6. PeopleInfo info=new PeopleInfo();
  7. info.setAddress("北京");
  8. info.setPhone("15201520190");
  9.  
  10. people.setInfo(info);
  11. info.setPeople(people);
  12. session.save(people);
  13. }

最后我们看看运行后生成的表

果然是只有一个表的 表中的列是People和PeopleInfo两个实体类中的集合

【学习笔记】Hibernate 一对一关联映射 组件映射 二级缓存 集合缓存的更多相关文章

  1. Hibernate第九篇【组件映射、继承映射】

    前言 到目前位置,我们已经学习了一对一.一对多.多对一.多对多映射了-既然Hibernate是ORM实现的框架,它还提供了组件映射和继承映射..本博文主要讲解组件映射和继承映射 Java主要的类主要有 ...

  2. mybatis学习笔记(10)-一对一查询

    mybatis学习笔记(10)-一对一查询 标签: mybatis mybatis学习笔记10-一对一查询 resultType实现 resultMap实现 resultType和resultMap实 ...

  3. SQL反模式学习笔记7 多态关联

    目标:引用多个父表 反模式:使用多用途外键.这种设计也叫做多态关联,或者杂乱关联. 多态关联和EAV有着相似的特征:元数据对象的名字是存储在字符串中的. 在多态关联中,父表的名字是存储在Issue_T ...

  4. Flutter学习笔记(10)--容器组件、图片组件

    如需转载,请注明出处:Flutter学习笔记(10)--容器组件.图片组件 上一篇Flutter学习笔记(9)--组件Widget我们说到了在Flutter中一个非常重要的理念"一切皆为组件 ...

  5. Flutter学习笔记(11)--文本组件、图标及按钮组件

    如需转载,请注明出处:Flutter学习笔记(10)--容器组件.图片组件 文本组件 文本组件(text)负责显示文本和定义显示样式,下表为text常见属性 Text组件属性及描述 属性名 类型 默认 ...

  6. Flutter学习笔记(12)--列表组件

    如需转载,请注明出处:Flutter学习笔记(12)--列表组件 在日常的产品项目需求中,经常会有列表展示类的需求,在Android中常用的做法是收集数据源,然后创建列表适配器Adapter,将数据源 ...

  7. Hibernate中一对一关联映射/组件映射

    Hibernate映射:一对一关联 1.按照外键映射 2.按照主键映射 组件映射 下面以员工账号表和员工档案表(员工账号和档案表之间是一对一的关系)为例,介绍这两种映射关系,并使用这两种 映射方式分别 ...

  8. Hibernate中的一对一关联和组件的映射

    Hibernate提供了两种映射一对一映射关联关系的方式: 01.按照外键映射 02.按照主键映射 下面以员工账号表和员工档案表(员工账号和档案表之间是一对一的关系)为例,介绍这两种映射关系,并使用这 ...

  9. Hibernate 一对一关联映射,mappedBy参数解析

    在最近java,SSH框架的学习中遇到了这样的一个问题,在Hibernate的开发中一对一关联映射的单向关联,主表会在次表新增一列次表的主键如下图,但是在双向关联中次表不会在表中创建主表的主键一列,这 ...

随机推荐

  1. 使用 IDEA和Maven 整合SSH框架

    1.创建web工程 一路next 下去就行.完成后,IDEA会自动构建maven工程. 2.创建如下项目结构 需要将 java文件夹设置为SourcesRoot目录,否则无法创建package 设置操 ...

  2. 一个简单的div弹出层的小例子

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/ ...

  3. js计算元素距离顶部的高度及元素是否在可视区判断

    前言: 在业务当中,我们经常要计算元素的大小和元素在页面的位置信息.比如说,在一个滚动区域内,我要知道元素A是在可视区内,还是在隐藏内容区(滚动到外边看不到了).有时还要进一步知道,元素是全部都显示在 ...

  4. P1345 [USACO5.4]奶牛的电信Telecowmunication

    P1345 [USACO5.4]奶牛的电信Telecowmunication 题目描述 农夫约翰的奶牛们喜欢通过电邮保持联系,于是她们建立了一个奶牛电脑网络,以便互相交流.这些机器用如下的方式发送电邮 ...

  5. linux_文件系统

    什么是文件系统? 存储和组织计算机数据文件的机制 分区和格式化区别? 分区是给房子打隔断,分为厨房.卧室--,格式化相当于给房子装修,让其能够让数据住进去 文件系统: 组织和管理文件 格式化: 往分区 ...

  6. python_如何在循环引用中管理内存?

    案例: python中通过引用计数来回收垃圾对象,在某些环形数据结构(树,图--),存在对象间的循环引用,比如树的父节点引用子节点,子节点同时引用父节点,此时通过del掉引用父子节点,两个对象不能被立 ...

  7. java.lang.ClassNotFoundException: com.radiadesign.catalina.session.RedisSessionHandlerValve

    org.apache.tomcat.util.digester.Digester.startElement Begin event threw exception java.lang.ClassNot ...

  8. BSA Network Shell系列-nexec命令

    # nexec ## 1 说明:nexec是远程命令接口引擎 ,用于在远程主机执行命令 nexec [-?] [-t term] [-o] [-i] [-l] [-nohup hostname &qu ...

  9. js中的语句

    java语句与js的语句一样.1.判断if else/switch <script type=text/javascript> function fun1(){ var num = 10; ...

  10. python的pika模块操作rabbitmq

    上一篇博文rabbitmq的构架和原理,了解了rabbitmq的使用原理,接下来使用python的pika模块实现使用rabbitmq. 环境搭建 安装python,不会的请参考Linux安装配置py ...