现在有三个类: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 一对一, 一对多, 多对多关联的更多相关文章

  1. JPA 一对一 一对多 多对一 多对多配置

    1 JPA概述 1.1 JPA是什么 JPA (Java Persistence API) Java持久化API.是一套Sun公司 Java官方制定的ORM 方案,是规范,是标准 ,sun公司自己并没 ...

  2. JPA级联(一对一 一对多 多对多)注解【实际项目中摘取的】并非自己实际应用

    下面把项目中的用户类中有个:一对一  一对多  多对多的注解对应关系列取出来用于学习      说明:项目运行正常 问题类:一对多.一对一.多对多 ============一对多 一方的设置 @One ...

  3. Python进阶----表与表之间的关系(一对一,一对多,多对多),增删改查操作

    Python进阶----表与表之间的关系(一对一,一对多,多对多),增删改查操作,单表查询,多表查询 一丶表与表之间的关系 背景: ​ ​ ​  ​ ​ 由于如果只使用一张表存储所有的数据,就会操作数 ...

  4. mybatis 一对一 一对多 多对多

    一对一 一对多 多对多

  5. 使用NHibernate(7)-- 一对一 && 一对多 && 多对多

    1, 一对一. 对于数据量比较大的时候,考虑查询的性能,肯能会把一个对象的属性分到两个表中存放:比如用户和用户资料,经常使用的一般是Id和用户名,用户资料(学校,籍贯等)是不经常被查询的,所以就会分成 ...

  6. day 69-70 一对一 一对多 多对一联表查询

    day 69 orm操作之表关系,多对多,多对一 多对一/一对多, 多对多{类中的定义方法} day69 1. 昨日内容回顾 1. 单表增删改查 2. 单表查询API 返回QuerySet对象的: 1 ...

  7. SQLAlchemy_定义(一对一/一对多/多对多)关系

    目录 Basic Relationship Patterns One To Many One To One Many To Many Basic Relationship Patterns 基本关系模 ...

  8. MySQL一对一:一对多:多对多: 实例!!!!

    学生表和课程表可以多对多 一个学生可以学多门课程 一门课程可以有多个学生: 多对多 *** 一个学生对应一个班级 一个班级对应多个学生: 一对多 *** 一个老师对应多个学生 多个学生对应一个老师:一 ...

  9. 初学者易上手的SSH-hibernate04 一对一 一对多 多对多

    这章我们就来学习下hibernate的关系关联,即一对一(one-to-one),一对多(one-to-many),多对多(many-to-many).这章也将是hibernate的最后一章了,用于初 ...

随机推荐

  1. Docker系统五:Docker仓库

    创建Docker Hub账户 登录和上传镜像到Hub.docker.com docker login //登陆hub.docker.com docker tag ubutun1404-baseimag ...

  2. [HNOI2014]道路堵塞

    题目描述 A国有N座城市,依次标为1到N.同时,在这N座城市间有M条单向道路,每条道路的长度是一个正整数.现在,A国交通部指定了一条从城市1到城市N的路径,并且保证这条路径的长度是所有从城市1到城市N ...

  3. V4L2驱动的移植与应用(三)

    三.V4L2的demo capture.c是官方示例程序. capture.c 程序中的 process_image 函数: capture.c 程序主要是用来演示怎样使用 v4l2 接口,并没有对采 ...

  4. R语言︱数据规范化、归一化

    每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ --------------------------- 笔者寄语:规范化主要是因为数据受着单位的影响较 ...

  5. Netty的并发编程实践1:正确使用锁

    很多刚接触多线程编程的开发者,虽然意识到了并发访问可变变量需要加锁,但是对于锁的范围.加锁的时机和锁的协同缺乏认识,往往会导致出现一些问题.下面笔者就结合Netty的代码来讲解下这方面的知识. 打开F ...

  6. eclipse中的System.getProperty("user.dir")

    eclipse中的System.getProperty("user.dir") 1.在Java Application中,上述中的获取的是Java项目的路径 (1)运行源码 /** ...

  7. html标签自带样式总结

    一.html标签自带样式 head { display:none; } body { margin:8px; line-height:1.12; } button, textarea, input, ...

  8. CentOS中配置NFS服务

    1.服务器端安装rpcbind.nfs-utils.nfs-server包 yum install nfs-utils -y 2.修改服务器端配置文件,添加需要共享的文件夹. vim /etc/exp ...

  9. httpclient案例一(调用识别接口)

    public Map<String, Object> pictureRecognition(String recotype, MultipartFile imageFile) { Stri ...

  10. C# 程序员最常犯的 10 个错误(转)

    关于C#关于本文常见错误 #1:把引用当做值来用,或者反过来常见错误 #2:误会未初始化变量的默认值常见错误 #3:使用不恰当或未指定的方法比较字符串常见错误 #4:使用迭代式 (而不是声明式)的语句 ...