Spring boot data JPA数据库映射关系 : @OneToOne,@OneToMany,@ManyToMany
问题描述
在利用Spring boot data JPA进行表设计的时候,表对象之间经常存在各种映射关系,如何正确将理解的映射关系转化为代码中的映射关系是关键之处。
解决办法
概念理解
举例:在公司的权限管理中,存在公司表、部门表、员工表。
- 公司表和部门表的关系:
主控方:部门表
被控方:公司表 - 部门表和员工表的关系:
由于是多对多的关系,不存在谁是主控方或被控方,两者处于平行关系。
- 公司表和部门表的关系:
一对多或多对一,用外键关联,若未设置级联删除,则删除被控方记录的时候会有外键约束。
- 多对多,用中间表关联,删除中间表的记录,不会各方的表造成影响。
- 在该四个注解中,都含有属性可设置,以下举例两个属性。
- fetch=FetchType.LAZY为默认的数据延迟加载,fetch=FetchType.EAGER为急加载。
- cascade={CascadeType.PERSIST,CascadeType.MERGE,
CascadeType.REFRESH,CascadeType.REMOVE}.
其中:
CascadeType.PERSIST级联新增(又称级联保存);
CascadeType.MERGE:级联合并(级联更新);
CascadeType.REMOVE:级联删除;
CascadeType.REFRESH:级联刷新
CascadeType.ALL:以上四种都是;
一般采用CascadeType.MERGE:级联合并(级联更新)即可。默认值是均不进行关联。
@OneToOne
- 在一对一的关系中,只需在主控方(数据总表)内注明@OneToOne,而被控方(员工表)只是作为外键,不需任何特殊标记。
@Entity
@Table(name = "costume_all_id")
public class AllId extends AbstractEntity {
private static final long serialVersionUID = 1L;
@OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "costume_member_fk")
private Member member;// 用户表外键
}
@OneToMany和@ManyToOne
- 公司(组织)表相对于部门表是被控方,只需在被控方写mappedBy,其值为主控方中引用的外键对象的名称。
@Entity
@Table(name = "costume_organization")
public class Organization extends AbstractEntity {
private static final long serialVersionUID = 1L;
@Column(nullable = false, length = 50)
private String name; // 组织名称
@OneToMany(mappedBy = "organization")
private Set<Department> departmentSet; // 部门集合
}
- 部门表相对于公司(组织)表是主控方,在主控方只需写@ManyToOne即可,其对象名为被控表中mappedBy中的值。
- 同时需要注意,如果需要将公司表对象或者部门表对象转为JSON数据的时候,为了防止出现无限循环包含对方,需要在部门表(多的一方)的引用公司表(少的一方)对象的set方法上写上注解@JsonBackReference
@Entity
@Table(name = "costume_department")
public class Department extends AbstractEntity {
private static final long serialVersionUID = 1L;
@Column(nullable = false, length = 50)
private String name; // 部门名称
@ManyToOne(optional = false)
private Organization organization; // 组织外键
@ManyToMany
private Set<Member> memberSet; // 用户表外键
public Organization getOrganization() {
return organization;
}
@JsonBackReference
public void setOrganization(Organization organization) {
this.organization = organization;
}
}
@ManyToMany
- 在多对多的情况下,如部门表和员工表之间的关系(暂不去深究一个员工是否能有多个部门的身份)。
- 部门表和员工表只需在引用对象集合上注明@ManyToMany即可,其中部门表的写法如上段代码,员工表的写法如下段代码。
- 在多对多的映射中会生成一张中间表,其表名和字段名均有默认的命名规则,若需指定表名和字段名,只需在两者的一方或双方写上@JoinTable注解即可,详情如下代码段,表名属性name=”table_name”,与joinColumns属性是同级属性,即写在其前即可。
- 同时需要注意,如果需要将员工表对象或者部门表对象转为JSON数据的时候,为了防止出现无限循环包含对方,需要在一方的引用对方对象的set方法(Set对象的set方法)上写上注解@JsonBackReference
@Entity
@Table(name = "costume_member")
public class Member extends AbstractEntity {
private static final long serialVersionUID = 1L;
@Column(nullable = false, length = 20)
private String name;
@ManyToMany
@JoinTable(joinColumns = { @JoinColumn(name = "member_id") }, inverseJoinColumns = {
@JoinColumn(name = "department_id") }) //被控方表字段名
private Set<Department> departmentSet; // 部门表外键
public Set<Department> getDepartmentSet() {
return departmentSet;
}
@JsonBackReference
public void setDepartmentSet(Set<Department> departmentSet)
{
this.departmentSet = departmentSet;
}
}
Spring boot data JPA数据库映射关系 : @OneToOne,@OneToMany,@ManyToMany的更多相关文章
- MyGeneration模板生成NHibernate映射文件和关系(one-to-one,one-to-many,many-to-many)
MyGeneration的几个NHibernate模板功能已经很强,但还是存在些问题.例如:Guid主键支持不佳,代码不易修改,不支持中文注释等等.所以我决定自己来改写此模版.我把一部分通用的函数提取 ...
- spring boot - 整合jpa多对对关系保存和查询示例
pojo: package com.example.zs.springDataJpa; import org.hibernate.annotations.Proxy; import javax.per ...
- Spring boot data jpa 示例
一.maven pom.xml文件 <?xml version="1.0" encoding="UTF-8"?> <project xmlns ...
- spring boot xml与dao 映射关系
mybatis的xml路径要和 dao的路径一模一样 dao 用@Mapper 注解
- Spring------Spring boot data jpa的使用方法
1.DoMain.java import org.springframework.boot.SpringApplication; import org.springframework.boot.aut ...
- Spring boot通过JPA访问MySQL数据库
本文展示如何通过JPA访问MySQL数据库. JPA全称Java Persistence API,即Java持久化API,它为Java开发人员提供了一种对象/关系映射工具来管理Java应用中的关系数据 ...
- Spring Boot(二):数据库操作
本文主要讲解如何通过spring boot来访问数据库,本文会演示三种方式来访问数据库,第一种是JdbcTemplate,第二种是JPA,第三种是Mybatis.之前已经提到过,本系列会以一个博客系统 ...
- 【Spring Boot&&Spring Cloud系列】Spring Boot中使用数据库之MySql
对于传统关系型数据库来说,Spring Boot使用JPA(Java Persistence API)资源库提供持久化的标准规范,即将Java的普通对象通过对象关系映射(ORM)持久化到数据库中. 项 ...
- Spring Boot2 系列教程(二十四)Spring Boot 整合 Jpa
Spring Boot 中的数据持久化方案前面给大伙介绍了两种了,一个是 JdbcTemplate,还有一个 MyBatis,JdbcTemplate 配置简单,使用也简单,但是功能也非常有限,MyB ...
随机推荐
- [转]Oracle - 数据库的实例、表空间、用户、表之间关系
本文转自:http://www.cnblogs.com/adforce/p/3312252.html 完整的Oracle数据库通常由两部分组成:Oracle数据库和数据库实例. 1) 数据库是一系列物 ...
- R in action读书笔记(21)第十六章 高级图形进阶(上)
16.1 R 中的四种图形系统 基础图形函数可自动调用,而grid和lattice函数的调用必须要加载相应的包(如library(lattice)).要调用ggplot2函数需下载并安装该包(inst ...
- php自动加载函数
含义:将函数注册到SPL __autoload函数栈中.如果该栈中的函数尚未激活,则激活它们. 先看__autoload 函数 printit.class.php <?php class PRI ...
- Farseer.net轻量级ORM开源框架 V1.x 入门篇:存储过程实体类映射
导航 目 录:Farseer.net轻量级ORM开源框架 目录 上一篇:Farseer.net轻量级ORM开源框架 V1.x 入门篇:视图的数据操作 下一篇:Farseer.net轻量级ORM开源 ...
- es6 day01
es6语法必须加‘use strict’ 'use strict' //预解释 变量提升 先看下边例子来感受下let的用法与特点 /* console.log(a);//undefined 只声明未定 ...
- cc.AudioSource
cc.AudioSource1:AudioSource组件是音频源组件, 发出声音的源头2: AudioSource组件面板: clip: 声源的播放的音频对象: AudioClip, mp3, wa ...
- jquery的$().each,$.each的区别02
在jquery中,遍历对象和数组,经常会用到$().each和$.each(),两个方法.两个方法是有区别的,从而这两个方法在针对不同的操作上,显示了各自的特点. $().each,对于这个方法,在d ...
- mysql出现问题汇总(持续更新)
1.mysql -uqwe -p普通用户登陆时提示: ERROR 1045 (28000): Access denied for user 'baijie'@'%' (using password: ...
- C#基础学习(一)
---恢复内容开始--- 1.最近被安排去做C#开发,然后开始一连串的看文档·看视屏,发现学C#给自己补了很多基础,C#每个函数变量什么都要先声名,而python可以直接定义: 一.数据类型 1.整数 ...
- 第二次:Ubuntu16.04 系统怎么截图
一开始想着写文章不用图,全靠文字描述,可是我错了,技术类文字没有图怎么能说的清楚,于是乎开始找在Ubuntu系统下的截图工具,网络神奇,发现了这个,以下命令可以反复试试: ubuntu 会自带一款截图 ...