布置的任务要用就写一下总结一下

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对应关系(了解)的更多相关文章

  1. 关于hibernate对应关系之后取值的问题

    hibernate对应关系之后取值,比如一对一关系,取不到值,需要检查PO类中是否生成了getter及setter方法.

  2. hibernate 对应关系级联的意思

    hibernate的关联关系,重点在理解级联cascade和inverse 1.cascade一般用在级联保存,级联更新,级联删除上 1.1cascade注解有两种,一种是基于hibernate注解 ...

  3. [原创]java WEB学习笔记81:Hibernate学习之路--- 对象关系映射文件(.hbm.xml):hibernate-mapping 节点,class节点,id节点(主键生成策略),property节点,在hibernate 中 java类型 与sql类型之间的对应关系,Java 时间和日期类型的映射,Java 大对象类型 的 映射 (了解),映射组成关系

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  4. 《Java从入门到放弃》入门篇:hibernate中的多表对应关系

    hibernate中的对应关系其实就是数据库中表的对应关系, 就跟某些电影中的某些场景是一样一样滴. 比如可以是一男一女,还可以是一男多女, 更可以是多男一女,最后最后最后还可以是多男多女!!! 有些 ...

  5. Springframework和Hibernate版本对应关系

    org.springframework 3.0.x对应org.hibernate4.0.x版本 org.springframework 3.2.x对应org.hibernate4.2.x版本 org. ...

  6. Hibernate(2)——Hibernate的实现原理总结和对其模仿的demo

    俗话说,自己写的代码,6个月后也是别人的代码……复习!复习!复习!涉及的知识点总结如下: 开源框架的学习思路(个人总结) Hibernate的运行原理总结 Hibernate实现原理中的两个主要技术 ...

  7. Hibernate(1)——数据访问层的架构模式

    俗话说,自己写的代码,6个月后也是别人的代码……复习!复习!复习!涉及到的知识点总结如下: 数据库的概念.逻辑.数据模型概念 应用程序的分层体系结构发展 MVC设计模式与四层结构的对应关系 持久层的设 ...

  8. Java三大框架之——Hibernate关联映射与级联操作

    什么是Hibernate中的关联映射? 简单来说Hibernate是ORM映射的持久层框架,全称是(Object Relational Mapping),即对象关系映射. 它将数据库中的表映射成对应的 ...

  9. Hibernate入门详解

    学习Hibernate ,我们首先要知道为什么要学习它?它有什么好处?也就是我们为什么要学习框架技术? 还要知道    什么是Hibernate?    为什么要使用Hibernate?    Hib ...

随机推荐

  1. 回顾曾经的自己,献给java初学者的建议

    要不惜代价投资自己,任何对自己的投资都是值得的 要多学习数据结构, 习惯看源码! 一份知识经过n个人的传递早已经不成样子了 遇到问题不要直接百度,百度上那些花里胡哨的东西有用的很少,对症下药才是王道, ...

  2. java类的继承(基础)

    ---恢复内容开始--- 这篇随笔和大家讲讲java中类的继承是什么?希望对你们有所帮助. 目录 一.java继承是什么? 二.为什么使用java继承 三.java继承的实现 1.1  java继承的 ...

  3. js常用JSON数据操作

    JSON字符串: var  str = '{"name": "jack", "age": 13}'; JSON对象: var obj = { ...

  4. mysql7笔记----存储过程实例

    mysql创建存储过程 DROP PROCEDURE IF EXISTS getCreateTimes /*前面要写DELIMITER $$ 或DELIMITER // */ DELIMITER $$ ...

  5. Python3 isdigit()方法

    描述 Python isdigit() 方法检测字符串是否只由数字组成. 语法 isdigit()方法语法: str.isdigit() 参数 无. 返回值 如果字符串只包含数字则返回 True 否则 ...

  6. win2008server R2 x64 部署.net core到IIS--ASP .NET Core HTTP Error 502.5 – Process Failure

    服务器win2008server R2 x64 部署.net core到IIS 解决ASP .NET Core HTTP Error 502.5 – Process Failure 问题等 1.发布网 ...

  7. jquery字符串操作

    目的:把自己常用到的jquery操作字符串总结一下 w3cSchool关于js字符串的整理:有需要的时候可以查 http://www.w3school.com.cn/js/jsref_obj_stri ...

  8. CSS3中三角形及三角形组合图实现

        几何之三角形及三角形的组合图案理论 三角形( triangle ['traɪæŋɡl])可以看成正方形对角线交叉形成的图形 若想得到编号①方向向下三角形,只需对编号②③④三角形让其透明tran ...

  9. windows本地远程虚拟机docker中的数据的问题

    关闭各种防火墙 打开宿主机(windows)的cmd,在其中添加通往192.168.1.0/24网络的路由. 通往192.168.1.0/24网络的数据包由172.20.1.12来转发 route a ...

  10. jQuery的一些简单基础知识

    ### 什么是jQuery?jQuery(js+Query)是一款优秀的JavaScript库,帮助开发人员用最少的代码做更多的事情,官网网站http://jquery.com/ ### 为什么学习j ...