Hibernate对应关系(了解)
布置的任务要用就写一下总结一下
hibernate有以下几种关系
一对一
一对多
多对一
多对多
首先这些对应关系是分单向和双向的 单向和双向有什么区别呢?
这个双向单向是面向对象的说法 意思就是你更新一个表另外一个表里面关联的数据跟着改变
双向就是这两个表无论哪一个更新另外一个表都更新 单向就是只有一个主表更新从表才更新 从表更新主表不管
单向:就是父亲管理孩子,父亲知道自己的孩子是谁,孩子并不知道自己的父亲是谁,比如我们user表单向一对多 book表 我们在user表里面设置book 的外键关联,当我们查询数据库的时候只能查找 用户的书籍有哪些,不能查看某一本书是哪个用户的
双向:查询的时候都可以从一方获取另一方的数据
注解的含义:
@Table(name = " ",catalog=" ", schema=" ")
//name表名,虽然可选,建议写上。catalog在MySql不支持,不必写。schema在MySql中指数据库名。
@Table(uniqueConstraints = {@UniqueConstraint(columnNames="name")})
或
@Column(name = "name",unique = true)
//指定建表时需要建唯一约束的列(使除主键外的列保持唯一约束)
@Embeddable
//表示一个非Entity类嵌入到一个Entity类作为属性而存在。
//使用方法,新建一个类注上该注解即可。在此类同样可使用注解对字段进行约束。
@embedded
//该注解是用来注释属性的,表示该类为嵌入类,同时,该类也得注释@Embeddable注解
@GeneratedValue(strategy=GenerationType)
GenerationType.AUTO //默认,根据底层数据库自动选择
GenerationType.INDENTITY //根据数据库的Identity字段生成
GenerationType.SEQUENCE //根据sequenqe来决定主键的取值
GenerationType.TABLE //使用指定表来决定主键取值,结合TableGenerator使用
@Id //自定义主键生成策略
@GeneratedValue(generator="sid") //名字
@GenericGenerator(name="sid",strategy="assigned") //策略
@EmbeddedId
//使用嵌入式主键类实现复合主键
//主键类必须实现Serializable接口,必须有默认的public无参构造方法,
//必须覆盖equals和hashCode()方法,必须注解@Embeddable
//使用时,把主键类对象当做参数传入Table类,对Table类进行保存即可。
@Transient
//表示该属性并非是到数据库表的字段的映射,否则默认注解@Basic
@Column(columnDefinition="TEXT", nullable=true)
//表示该字段为数据库中的TEXT类型,存储长文本
关系映射注解@OneToOne(cascade = {CascadeType.ALL})
CascadeType.PERSIST:级联新增(又称级联保存):对order对象保存时也对items里的对象也会保存。对应EntityManager的presist方法。
CascadeType.MERGE:级联合并(级联更新):若items属性修改了那么order对象保存时同时修改items里的对象。对应EntityManager的merge方法 。
CascadeType.REMOVE:级联删除:对order对象删除也对items里的对象也会删除。对应EntityManager的remove方法。
CascadeType.REFRESH:级联刷新:获取order对象里也同时也重新获取最新的items时的对象。对应EntityManager的refresh(object)方法有效。即会重新查询数据库里的最新数据。
CascadeType.ALL:以上四种都是。
hibernate的FetchType注解属性
FetchType.LAZY:懒加载,加载一个实体时,定义懒加载的属性不会马上从数据库中加载,即从数据库读到内存。
FetchType.EAGER:急加载,加载一个实体时,定义急加载的属性会立即从数据库中加载。也可以说成表示关联关系的从类在主类加载时同时加载
orphanRemoval=true
在一对多的关系当中,我们通常喜欢使用 CascadeType.ALL 假设现在有 user ,book 表 一个用户对应多本书,当我们删除用户的时候通常会删除他所关联的书籍, 当我们删除书本时如果不设置orphanRemoval=true 用户也会被删除,设置之后 user 就不会被删除
一对一:
单向:
@Entity
@Table(name="User")
public class User {
@Id
@GeneratedValue
@Column(name="sid")
private int sid;
@Column(name="name")
private String name;
@OneToOne(cascade = {CascadeType.ALL})
@JoinColumn(name = "pid",unique=true)
//name=定义外键在本表的字段名,若只配置本类,则为单向关联
//unique=true是指这个字段的值在这张表里不能重复,所有记录值都要唯一,就像主键那样
private Room room;
...
}
双向:
@Entity
@Table(name="Room")
public class Room {
@Id
@Column(name="cid")
private int cid;
@Column(name="addr")
private String addr;
@OneToOne(mappedBy="room")//被控方
//mappedBy同样指定由对方来进行维护关联关系 // 关于mappedBy的解释 参考博客:https://www.cnblogs.com/chiangchou/p/mappedBy.html
private User user;
...
}
一对多:
单向:
//正常建表
@Entity
@Table(name="User")
public class User {
@Id
@GeneratedValue
@Column(name="sid")
private int sid;
@Column(name="name")
private String name;
...
}
@Entity
@Table(name="Room")
public class Room {
@Id
@GeneratedValue
@Column(name="cid")
private int cid;
@Column(name="addr")
private String addr;
@OneToMany(cascade={CascadeType.ALL}, fetch=FetchType.LAZY) //一对多为Lazy,多对一为Eager
@JoinColumn(name="cid") //name=定义外键在本表的字段名
private Set<User> users;
...
}
多对一:
//正常建表
@Entity
@Table(name="Room")
public class Room {
@Id
@Column(name="cid")
private int cid;
@Column(name="addr")
private String addr;
...
}
@Entity
@Table(name="User")
public class User {
@Id
@GeneratedValue
@Column(name="sid")
private int sid;
@Column(name="name")
private String name;
@ManyToOne(cascade={CascadeType.ALL}, fetch=FetchType.EAGER) //一对多为Lazy,多对一为Eager
@JoinColumn(name="cid", referencedColumnName="cid") //name=定义外键在本表的字段名 rCN=关联外键对象的哪个字段
private Room room;
...
}
双向(一对多,多对一):
@Entity
@Table(name="User")
public class User {
@Id
@GeneratedValue
@Column(name="sid")
private int sid;
@Column(name="name")
private String name;
@ManyToOne(cascade={CascadeType.ALL}, fetch=FetchType.EAGER) //一对多为Lazy,多对一为Eager
@JoinColumn(name="cid") //name=定义外键在本表的字段名
private Room room;
...
}
@Entity
@Table(name="Room")
public class Room {
@Id
@GeneratedValue
@Column(name="cid")
private int cid;
@Column(name="addr")
private String addr;
@OneToMany(cascade={CascadeType.ALL}, fetch=FetchType.LAZY) //一对多为Lazy,多对一为Eager
@JoinColumn(name="cid") //name=定义外键在本表的字段名
private Set<User> users;
...
}
多对多
多对多需要创建一张中间表
单向
@Entity
@Table(name="t_course")
public class Course
{
@Id
@GeneratedValue
private int id;
private String name;
@ManyToMany ---> ManyToMany指定多对多的关联关系
@JoinTable(name="t_teacher_course",
joinColumns={@JoinColumn(name="cid")},
inverseJoinColumns={ @JoinColumn(name = "tid") })
/*因为多对多之间会通过一张中间表来维护两表直接的关系,所以通过 JoinTable
这个注解来声明,我方是Course,所以在对方外键的名称就是 rid,
inverseJoinColumns也是一个 @JoinColumn类型的数组,
表示的是对方在我这放中的外键名称,对方是Teacher,所以在我方外键的名称就是 tid*/
private Set<Teacher> teachers;
...
}
双向
@Entity
@Table(name="t_teacher")
public class Teacher
{
@Id
@GeneratedValue
private String name;
@ManyToMany(mappedBy="teachers")//表示由Course那一方来进行维护
private Set<Course> courses;
...
}
Hibernate对应关系(了解)的更多相关文章
- 关于hibernate对应关系之后取值的问题
hibernate对应关系之后取值,比如一对一关系,取不到值,需要检查PO类中是否生成了getter及setter方法.
- hibernate 对应关系级联的意思
hibernate的关联关系,重点在理解级联cascade和inverse 1.cascade一般用在级联保存,级联更新,级联删除上 1.1cascade注解有两种,一种是基于hibernate注解 ...
- [原创]java WEB学习笔记81:Hibernate学习之路--- 对象关系映射文件(.hbm.xml):hibernate-mapping 节点,class节点,id节点(主键生成策略),property节点,在hibernate 中 java类型 与sql类型之间的对应关系,Java 时间和日期类型的映射,Java 大对象类型 的 映射 (了解),映射组成关系
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
- 《Java从入门到放弃》入门篇:hibernate中的多表对应关系
hibernate中的对应关系其实就是数据库中表的对应关系, 就跟某些电影中的某些场景是一样一样滴. 比如可以是一男一女,还可以是一男多女, 更可以是多男一女,最后最后最后还可以是多男多女!!! 有些 ...
- Springframework和Hibernate版本对应关系
org.springframework 3.0.x对应org.hibernate4.0.x版本 org.springframework 3.2.x对应org.hibernate4.2.x版本 org. ...
- Hibernate(2)——Hibernate的实现原理总结和对其模仿的demo
俗话说,自己写的代码,6个月后也是别人的代码……复习!复习!复习!涉及的知识点总结如下: 开源框架的学习思路(个人总结) Hibernate的运行原理总结 Hibernate实现原理中的两个主要技术 ...
- Hibernate(1)——数据访问层的架构模式
俗话说,自己写的代码,6个月后也是别人的代码……复习!复习!复习!涉及到的知识点总结如下: 数据库的概念.逻辑.数据模型概念 应用程序的分层体系结构发展 MVC设计模式与四层结构的对应关系 持久层的设 ...
- Java三大框架之——Hibernate关联映射与级联操作
什么是Hibernate中的关联映射? 简单来说Hibernate是ORM映射的持久层框架,全称是(Object Relational Mapping),即对象关系映射. 它将数据库中的表映射成对应的 ...
- Hibernate入门详解
学习Hibernate ,我们首先要知道为什么要学习它?它有什么好处?也就是我们为什么要学习框架技术? 还要知道 什么是Hibernate? 为什么要使用Hibernate? Hib ...
随机推荐
- ES6基础
一.新增命令let/const ①:let命令 1.let命令用来声明变量,它的用法类似于var,但是所声明的变量只在let命令所在的代码块内生效. 所以在for循环中,就很适合使用let命令. 上面 ...
- flex-手机端主页布局实例---构造页面结构
Flexbox页面布局实例,成本效果图如下, 源码下载在最下面. 源码下载:https://pan.baidu.com/s/18o5hVuWtflUpgvMk3LzQ5w 提取码:wiyc样本地址: ...
- Kail Linux的安装方法
众所周知,kail 是一个基于Debian的Linux发行版,它的目标就是为了在一个实用的工具包里尽可能多的包含渗透和审计工具 kail就实现了这个目标,里面包含有很多关于安全测试的开源工具,如果现在 ...
- DVWA 黑客攻防演练(十四)CSRF 攻击 Cross Site Request Forgery
这么多攻击中,CSRF 攻击,全称是 Cross Site Request Forgery,翻译过来是跨站请求伪造可谓是最防不胜防之一.比如删除一篇文章,添加一笔钱之类,如果开发者是没有考虑到会被 C ...
- C语言字符数组回顾
赋值篇: Part1 错误引例*2: char c6[];//WRONG c6="HELLO";//WRONG char c7[];//WRONG c7[]='H';// ...
- c#面试题汇总(1)
c#面试题汇总 From: https://www.cnblogs.com/suzhiyong1988/p/5069385.html 下面的参考解答只是帮助大家理解,不用背,面试题.笔试题千变万化 ...
- C# Socket网络编程
晚上利用空闲时间,用Socket做了一些小功能. 功能如下: a.聊天 b.传文件 c.抖动好友 主界面: 服务器 客户端 操作步骤: 服务器(测试环境的IP地址为:192.168.92.111,视情 ...
- Win 10 无法打开内核设备“\\.\Global\vmx86”问题
Win 10操作系统, VMWareWorkstation10 无法打开内核设备"\\.\Global\vmx86": 系统找不到指定的文件.你想要在安装 VMware Works ...
- 编辑器之神-vim的使用
vim即vi的升级版:在linux中,vi是vim的软链接,我们敲vi和vim出来的都是vim: 纯手打,如有错误,敬请指出. vi的三种模式及简单使用 vi三种模式 命令模式(默认):是文件的入口, ...
- Java基础系列--01_基础类型
J2SE.J2ME.J2EE分别指什么? J2SE 基础版,桌面应用. J2ME 微型版,手机开发.(android,ios) J2EE 企业版,所有浏览器访问的应用程序. 注意:JDK5以后改名 J ...