【学习笔记】Hibernate 一对一关联映射 组件映射 二级缓存 集合缓存
啊讲道理放假这十天不到啊
感觉生活中充满了绝望 这就又开学了
好吧好吧继续学习笔记?还是什么的
一对一关联映射
这次我们仍然准备了两个表
一个是用户表Users
一个是档案表Resume
他们的关系是一对一(一个用户只能有一份档案 一份档案只能属于一个永固)
我们无需建表,Hibernate会检查数据库中有没有对应的表,如果没有,自动生成
我们也可以用来看自动生成的表是什么样子的
一对一外键映射FK
那么接下来是小配置文件
user的小配置文件
<one-to-one name="resume" class="Resume" property-ref="user"></one-to-one>
name属性是小配置关联的实体类中 存放的另一个实体的对象的名称
Class当然是一对一关系中对应的实体类
那么Users这个实体类结构如下

property-ref 改变有关联关系对象的列的等值对比
默认:A表主键默认关联B表主键
设置后是让A表的主键关联B表的非主键列
resume的小配置文件
<many-to-one name="users" class="Users" columm="uid" unique="true" cascade="all"></many-to-one>
column 关联的主键列(相当于档案表是外检表,用户表是主表)
unique 唯一的 保证了一对一的关系
Resume实体类如下

编写测试类。
@Before
public void before() {
session = HibernateUtil.currentSession();
tx = session.beginTransaction();
} @After
public void after() {
tx.commit();
HibernateUtil.closeSession();
} @Test
public void insert() {
Resume resume = new Resume();
resume.setResname("斯沃的机密档案"); Users user = new Users();
user.setUname("斯沃"); resume.setUser(user);
user.setResume(resume); session.save(resume);
}
运行成功后我们来看看自动生成的表的结构


User用户表里只有我们的编号和姓名两列
而在档案表里除了编号和档案名称
还多出了一列 用户id
一对一外键映射相当于一个一对多的关联映射,但是加上了一个唯一约束使得一个User只能对应一个档案
(否则多个档案的Userid列会可以指向同一个User)
一对一主键映射PK
然后呢是一对一主键映射
我比较懒 因为已经提前知道一对一外键映射和逐渐映射
自动生成的表的表结构是不一样的
可是我比较不想举一个新的例子 所以仍用用户和档案的例子
为了避免重复,我们在小配置中让他们关联的表名变化
这次是Users2表和Resume2表(虽然实体类的名称没有变)
那么实体类是没有变化的
我们直接来看小配置
先看档案的
<one-to-one name="user" class="Users" cascade="all"></one-to-one>
没有什么可以说的样子
看Users用户的
哦对了在这里突然想到 为什么用户表叫Users而不是User 关键字的问题
<one-to-one name="resume" class="Resume" constrained="true"></one-to-one>
constrained 约束用户表中出现的档案列必须在主表档案表中出现过
另外一点 就是Users表的主键生成策略
<id name="userid" type="java.lang.Integer">
<!--主键生成策略-->
<generator class="foreign">
<param name="property">resume</param>
</generator>
</id>
这里使用的主键生成策略是foreign 关联到的是表RESUME
也就是两个表的对应的记录的主键会相同
所以在查询的时候只需要查询一个主键就可以把它们关联起来
测试类的代码如下
@Before
public void before() {
session = HibernateUtil.currentSession();
tx = session.beginTransaction();
} @After
public void after() {
tx.commit();
HibernateUtil.closeSession();
} @Test
public void insert() {
Resume resume = new Resume();
resume.setResname("斯沃的机密档案"); Users user = new Users();
user.setUname("斯沃"); resume.setUser(user);
user.setResume(resume); session.save(user);
}
等等 为啥感觉区别不大= =
不要在意细节 看看结果是怎么样的


果然如我所说= =
组件映射
那么接下来是组件映射
组件映射就是两个实体类 一对一的关系
或者说其实一个实体类是另一个实体类的扩展
我们举的例子是一个 People 人 和一个PeopleInfo 人的信息
其中人保存的是人的编号pid 名字pname 和 对应的人的信息这个实体类
我们看一下两个实体类


噢我们只需要一个小配置文件 就是People的小配置文件
那么需要怎么写。。。
<class name="People" table="PEOPLE">
<id name="pid" type="java.lang.Integer">
<!--主键生成策略-->
<generator class="native"/>
</id>
<property name="pname" type="string"/> <component name="info" class="PeopleInfo">
<parent name="people"/>
<property name="address"></property>
<property name="phone"></property>
</component>
</class>
在class节点中
使用一个component节点 关联着另一个类
然后 就 可以使用 了
@Test
public void insert() {
People people=new People();
people.setPname("天命"); PeopleInfo info=new PeopleInfo();
info.setAddress("北京");
info.setPhone("15201520190"); people.setInfo(info);
info.setPeople(people);
session.save(people);
}
最后我们看看运行后生成的表

果然是只有一个表的 表中的列是People和PeopleInfo两个实体类中的集合
【学习笔记】Hibernate 一对一关联映射 组件映射 二级缓存 集合缓存的更多相关文章
- Hibernate第九篇【组件映射、继承映射】
前言 到目前位置,我们已经学习了一对一.一对多.多对一.多对多映射了-既然Hibernate是ORM实现的框架,它还提供了组件映射和继承映射..本博文主要讲解组件映射和继承映射 Java主要的类主要有 ...
- mybatis学习笔记(10)-一对一查询
mybatis学习笔记(10)-一对一查询 标签: mybatis mybatis学习笔记10-一对一查询 resultType实现 resultMap实现 resultType和resultMap实 ...
- SQL反模式学习笔记7 多态关联
目标:引用多个父表 反模式:使用多用途外键.这种设计也叫做多态关联,或者杂乱关联. 多态关联和EAV有着相似的特征:元数据对象的名字是存储在字符串中的. 在多态关联中,父表的名字是存储在Issue_T ...
- Flutter学习笔记(10)--容器组件、图片组件
如需转载,请注明出处:Flutter学习笔记(10)--容器组件.图片组件 上一篇Flutter学习笔记(9)--组件Widget我们说到了在Flutter中一个非常重要的理念"一切皆为组件 ...
- Flutter学习笔记(11)--文本组件、图标及按钮组件
如需转载,请注明出处:Flutter学习笔记(10)--容器组件.图片组件 文本组件 文本组件(text)负责显示文本和定义显示样式,下表为text常见属性 Text组件属性及描述 属性名 类型 默认 ...
- Flutter学习笔记(12)--列表组件
如需转载,请注明出处:Flutter学习笔记(12)--列表组件 在日常的产品项目需求中,经常会有列表展示类的需求,在Android中常用的做法是收集数据源,然后创建列表适配器Adapter,将数据源 ...
- Hibernate中一对一关联映射/组件映射
Hibernate映射:一对一关联 1.按照外键映射 2.按照主键映射 组件映射 下面以员工账号表和员工档案表(员工账号和档案表之间是一对一的关系)为例,介绍这两种映射关系,并使用这两种 映射方式分别 ...
- Hibernate中的一对一关联和组件的映射
Hibernate提供了两种映射一对一映射关联关系的方式: 01.按照外键映射 02.按照主键映射 下面以员工账号表和员工档案表(员工账号和档案表之间是一对一的关系)为例,介绍这两种映射关系,并使用这 ...
- Hibernate 一对一关联映射,mappedBy参数解析
在最近java,SSH框架的学习中遇到了这样的一个问题,在Hibernate的开发中一对一关联映射的单向关联,主表会在次表新增一列次表的主键如下图,但是在双向关联中次表不会在表中创建主表的主键一列,这 ...
随机推荐
- 微信小程序左右滑动切换图片酷炫效果(附效果)
开门见山,先上效果吧!感觉可以的用的上的再往下看. 心动吗?那就继续往下看! 先上页面结构吧,也就是wxml文件,其实可以理解成微信自己封装过的html,这个不多说了,不懂也没必要往下看了. < ...
- JVM-类加载器
类加载器 对于虚拟机的角度来看,只存在两种类加载器: 启动类加载器(Brootstrap ClassLoader)和"其他类加载器".启动类加载器是由C++写的,属于虚拟机的一部分 ...
- junit4X系列源码--总体介绍
原文出处:http://www.cnblogs.com/caoyuanzhanlang/p/3530267.html.感谢作者的无私分享. Junit是一个可编写重复测试的简单框架,是基于Xunit架 ...
- Centos7下Java开发基本环境搭建
一.Centos7安装JDK 首先查看自己的机器上是否已经自带openjdk,命令如下: rpm -qa | grep jdk 如果存在,则按照如下命令进行依次卸载: yum -y remove fi ...
- oracle case when及decode的用法
case ... when 语句 1) CASE column_name WHEN value1 THEN resutl1,... [ ELSE result ] END select name , ...
- windows 7 wifi热点配置
自我总结,有什么不足或更好的解决方案,请告知,感激不尽! 目的:闲来无事的童鞋,可以试一试自己配置wifi热点. ps:其实wifi热点配置是系统存在的功能,只不过需要配置. 现在win桌面wifi热 ...
- 01_Linux软件源配置
一.国内软件源 阿里源:https://mirrors.aliyun.com/ 清华大学:https://mirrors.tuna.tsinghua.edu.cn/ 中科大 : https://mir ...
- 免费分享Navicat12各版本破解(仅供学习使用)
花了几个小时终于找到比较"绿色"的安装包了...(无力吐槽下现在网上好多挂羊头卖狗肉的网站) https://pan.baidu.com/s/1geMIkfT 密码:9a98 里面 ...
- json和xml的两者区别
服务器端返回给客户端的数据一般都是JSON格式,JSON数据以键值的形式保存,数据之间以逗号分隔,{}表示对象,[]表示数组.JSON数据解析方案有四种,JSONKit,SBJson,TouchJso ...
- bzoj 1975: [Sdoi2010]魔法猪学院 [k短路]
1975: [Sdoi2010]魔法猪学院 裸题... 被double坑死了 #include <iostream> #include <cstdio> #include &l ...