Spring - JPA 一对一, 一对多, 多对多关联
现在有三个类:One Many Much
One类
Much类 @Entity
public class Much { @Id
@GeneratedValue
private Integer id; private String name; @ManyToMany
@JoinTable(
name = "much_more",
joinColumns= {@JoinColumn(name = "many_id", referencedColumnName = "id")},
inverseJoinColumns= {@JoinColumn(name = "much_id", referencedColumnName = "id")})
private List<Many> manys; public Integer getId() {
return id;
} public void setId(Integer id) {
this.id = id;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public List<Many> getManys() {
return manys;
} public void setManys(List<Many> manys) {
this.manys = manys;
} }
@Entity public class One { @Id @GeneratedValue private Integer id; private String name; // one to many @OneToMany(cascade = CascadeType.ALL, mappedBy = "one") // @JoinColumn(name = "many_id") private List<Many> manys; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
Many类 @Entity
public class Many { @Id
@GeneratedValue
private Integer id; private String name; @ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "one_id")
private One one; public Integer getId() {
return id;
} @ManyToMany(mappedBy="manys")
private List<Much> muchs; public void setId(Integer id) {
this.id = id;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public List<Much> getMuchs() {
return muchs;
} public void setMuchs(List<Much> muchs) {
this.muchs = muchs;
} public One getOne() {
return one;
} public void setOne(One one) {
this.one = one;
}
}
一对一:现有一个single类和One是一对一关系,则只需要在SIngle类中添加如下即可
@OneToOne(fetch = FETCHTYPE.EAGE)
private One one;
此时生成的表结构是: 在Single表中有一个one_id字段指向one表的主键
一对多: 一个one对应多个many,
首先在一端添加:
@OneToMany(cascade = CascadeType.ALL, mappedBy = "one") //mappedBy = "one" 表示one是一对多管理的被维护端, 既当添加many时顺带添加一个one
private List<Many> manys;
然后再多端添加:
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "one_id") // 在多端(从表的外键)添加外键字段指向一端(主表的主键)的主键字段
private One one;
此时生成的表结构是:在Many表里有一个one_id外键指向一端One
多对多:
拿many和much来说, 他们多对多关系, 我们先确定谁是多放关系的维护端,这里我指定Much为多方关系的维护端。
多对多关系中,hibernate会自动生成中间表。
在Much中添加:
Much类 @ManyToMany
@JoinTable( // JoinTable所在的一端为多方关系的维护端
name = "much_more", // 指定中间表名
joinColumns= {@JoinColumn(name = "much_id", referencedColumnName = "id")}, // 指定当前表在中间表的外键名称和外键所指向的当前表主键
inverseJoinColumns= {@JoinColumn(name = "more_id", referencedColumnName = "id")} // 指定另一方在中间表的外键名称和外键所指向的主键
)
private List<Many> manys;
然后在多方关系的被维护端Many中添加:
@ManyToMany(mappedBy="manys") // mappedBy指定many为多方关系的被维护端
private List<Much> muchs;
此时生成的表结构是:生成一个中间表叫much_more, 外键字段叫much_id,more_id分别指向两个表的主键
欢迎大家指正。
Spring - JPA 一对一, 一对多, 多对多关联的更多相关文章
- JPA 一对一 一对多 多对一 多对多配置
1 JPA概述 1.1 JPA是什么 JPA (Java Persistence API) Java持久化API.是一套Sun公司 Java官方制定的ORM 方案,是规范,是标准 ,sun公司自己并没 ...
- JPA级联(一对一 一对多 多对多)注解【实际项目中摘取的】并非自己实际应用
下面把项目中的用户类中有个:一对一 一对多 多对多的注解对应关系列取出来用于学习 说明:项目运行正常 问题类:一对多.一对一.多对多 ============一对多 一方的设置 @One ...
- Python进阶----表与表之间的关系(一对一,一对多,多对多),增删改查操作
Python进阶----表与表之间的关系(一对一,一对多,多对多),增删改查操作,单表查询,多表查询 一丶表与表之间的关系 背景: 由于如果只使用一张表存储所有的数据,就会操作数 ...
- mybatis 一对一 一对多 多对多
一对一 一对多 多对多
- 使用NHibernate(7)-- 一对一 && 一对多 && 多对多
1, 一对一. 对于数据量比较大的时候,考虑查询的性能,肯能会把一个对象的属性分到两个表中存放:比如用户和用户资料,经常使用的一般是Id和用户名,用户资料(学校,籍贯等)是不经常被查询的,所以就会分成 ...
- day 69-70 一对一 一对多 多对一联表查询
day 69 orm操作之表关系,多对多,多对一 多对一/一对多, 多对多{类中的定义方法} day69 1. 昨日内容回顾 1. 单表增删改查 2. 单表查询API 返回QuerySet对象的: 1 ...
- SQLAlchemy_定义(一对一/一对多/多对多)关系
目录 Basic Relationship Patterns One To Many One To One Many To Many Basic Relationship Patterns 基本关系模 ...
- MySQL一对一:一对多:多对多: 实例!!!!
学生表和课程表可以多对多 一个学生可以学多门课程 一门课程可以有多个学生: 多对多 *** 一个学生对应一个班级 一个班级对应多个学生: 一对多 *** 一个老师对应多个学生 多个学生对应一个老师:一 ...
- 初学者易上手的SSH-hibernate04 一对一 一对多 多对多
这章我们就来学习下hibernate的关系关联,即一对一(one-to-one),一对多(one-to-many),多对多(many-to-many).这章也将是hibernate的最后一章了,用于初 ...
随机推荐
- visual studio调试功能简述
vs调试简述 1.调试功能简述 vs提供了很强大的调试功能,能够让我们一步步执行中找到每个变量的值,便于查错改错.很多IDE都有调试功能,在使用调试功能时,记得先创建一个项目,哪怕是一个文件,也创建一 ...
- SDP(9):MongoDB-Scala - data access and modeling
MongoDB是一种文件型数据库,对数据格式没有硬性要求,所以可以实现灵活多变的数据存储和读取.MongoDB又是一种分布式数据库,与传统关系数据库不同的是,分布式数据库不支持table-join,所 ...
- Vue第一个自定义组件:数字输入框(number-input)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Node.js模块导出module.exports 和 exports,Es6模块导出export 和export default的区别
1.module.exports module变量代表当前模块.这个变量是一个对象,module对象会创建一个叫exports的属性,这个属性的默认值是一个空的对象: module.exports ...
- css入门二-常用样式
css入门二-常用样式总结 基本标签样式 背景色background-color 高度height; 宽度width; 边框对齐以及详细设定举例 width/*宽度*/: 80%; height/*高 ...
- PCIe设备的配置空间
关于PCI设备的配置空间网上已经有很多资料了,如下图就是PCI设备必须支持的64个字节的配置空间,范围为0x00-0x3f. 很多PCI设备仅仅支持者64字节的配置空间.PCI和PCIe配置空间的区别 ...
- Flex中的FusionCharts 2D饼图
1.设计思路 (1)FusionCharts中有Flex组件文件FusionCharts.swc,这样可以让FusionCharts用Flex展示出来: (2)利用xmlns:components=& ...
- “var arr = []; ”和 “var arr = {};” 的区别
1.面试题 var arr = []; var arr = {}; 比较上述代码有什么区别? 2.解析 var arr = [];是一个数组对象 var arr = {} ...
- web开发中对缓存的使用
很久没有发表随笔了,最近工作不是太忙,抽点时间 给大家谈谈缓存吧 ; 在我从事web开发的几年实践中 接触了缓存技术 也是比较多的,在最初的 项目当中 我们用到 hibernate 的 一二级缓存, ...
- @SuppressWarnings("unchecked")(解决标准的后台HttpServletRequest request, HttpServletResponse response)格式
在springmvc的应用中有些限制会出现必须是 public void save(HttpServletRequest request, HttpServletResponse response) ...