使用JPA双向多对多关联关系@ManyToMany
作者:qq_36722039 发布时间:2021-12-04 03:37:12
标签:JPA,双向多对多,关联关系,@ManyToMany
JPA双向多对多关联关系@ManyToMany
package com.jpa.helloworld;
import java.util.HashSet;
import java.util.Set;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.ManyToMany;
import javax.persistence.Table;
@Table(name="CATEGORYS")
@Entity
public class Category {
private Integer cID;
private String cName;
private Set<Item> items = new HashSet<Item>();
@Id
@Column(name="C_ID")
@GeneratedValue
public Integer getcID() {
return cID;
}
public void setcID(Integer cID) {
this.cID = cID;
}
@Column(name="C_NAME")
public String getcName() {
return cName;
}
public void setcName(String cName) {
this.cName = cName;
}
//添加了mappedBy属性则不能使用@JoinTable注解
@ManyToMany(mappedBy="categorys")
public Set<Item> getItems() {
return items;
}
public void setItems(Set<Item> items) {
this.items = items;
}
}
package com.jpa.helloworld;
import java.util.HashSet;
import java.util.Set;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.Table;
@Table(name="ITEMS")
@Entity
public class Item {
private Integer iId;
private String iName;
private Set<Category> categorys = new HashSet<Category>();
@Id
@GeneratedValue
@Column(name="I_ID")
public Integer getiId() {
return iId;
}
public void setiId(Integer iId) {
this.iId = iId;
}
@Column(name="I_NAME")
public String getiName() {
return iName;
}
public void setiName(String iName) {
this.iName = iName;
}
//使用@JoinTable注解添加中间表
//其中name属性设置中间表的表名
//joinCloums属性在中间表中添加的列
//JoinColumns属性:
//@joinColumn属性设置中间表中的列名
//referencedColumnName属性指向被映射表的主键(可以没有该属性)
//@inverseJoinColumns另外一张表在中间表中的列
@JoinTable(
name="ITEMS_CATEGORYS",
//joinColumns = {@JoinColumn(name="ITEM_ID",referencedColumnName="I_ID")},
joinColumns = {@JoinColumn(name="ITEM_ID")},
//inverseJoinColumns= {@JoinColumn(name="CATEGORY_ID", referencedColumnName="C_ID")})
inverseJoinColumns= {@JoinColumn(name="CATEGORY_ID")})
@ManyToMany
public Set<Category> getCategorys() {
return categorys;
}
public void setCategorys(Set<Category> categorys) {
this.categorys = categorys;
}
}
ManyToMany和OneToMany的双向控制
下面我们使用权限管理中Role<->Account(用户ManyToMany账号)、Role<->Domain(用户OneToMany权限域)的关系来举例。
1、ManyToMany
Role表
Account表
在两个表的对应属性上添加JoinColumns和inverseJoinColumns,并且相互交换。
JoinColumn
指定本表在中间表中的列名。inverseJoinColumns
指定受控方的列名。
在两个类中都加上这两个属性,并且值互换,则能够实现双向控制,即任何一方删除,都会自动删除对应中间表的数据。
2、OneToMany以及ManyToOne
Role表
Domain表
cascade用来指定级联操作, cascade的值只能从CascadeType.PERSIST(级联新建)、CascadeType.REMOVE(级联删除)、CascadeType.REFRESH(级联刷新)、CascadeType.MERGE(级联更新)中选择一个或多个。还有一个选择是使用CascadeType.ALL,表示选择全部四项。
如果不指定Cascade,默认是空的,那么在删除Role的时候,只会把Domain表中的role这一列的值删除,而该条记录不删除。
JoinColumn需要指定,如果不指定就会在Domain表中增加额外的一列,这一列与Domain的id一样。经过试验,不指定还会造成级联查找失败,原因未知。
来源:https://blog.csdn.net/qq_36722039/article/details/81057897
0
投稿
猜你喜欢
- 1. 前言随着数据量和调用量的增长,用户对应用的性能要求越来越高。另外,在实际的服务中,还存在着这样的场景:系统在组装数据的时候,对于数据的
- 需求背景最近的一个项目,在项目基本完工的阶段,客户提出要将所有业务操作的日志记录到数据库中,并且要提取一些业务的关键信息(比如交易单号)体现
- 我们在开发Java项目的时候,经常需要对参数进行一些必填项、格式、长度等进行校验,如果手写代码对参数校验,每个接口会需要很多低级的代码,这样
- 我们知道,spring boot自动配置功能可以根据不同情况来决定spring配置应该用哪个,不应该用哪个,举个例子:Spring的Jdbc
- 简述在学着使用Java的命令行来编译java文件的时候,遇到了这个问题Windows操作系统报错“‘
- Logback日志基础配置logback日志配置有很多介绍,但是有几个非常基础的,容易忽略的。下面是最简单的一个配置,注意加粗的描述<
- 在《Spring Boot Hello World》中介绍了一个简单的spring boot例子,体验了spring boot中的诸多特性,
- 输入方法第一种输入方法:scannerimport java.util.Scanner; // 导入java.util.Scannerpub
- 如果所有的键都是小整数,我们可以使用一个数组来实现无序的符号表,将键作为数组的索引而数组中键 i 处存储的就是它对应的值。散列表就是用来处理
- 前言通过adb shell input可以模拟android各种输入事件,比如文字、按键、触摸等等。adb shell inputUsage
- springboot整合tkmapper1.导入pom依赖1.1 导入springboot的parent依赖<parent> &
- 今天有朋友问我一道面试题,有5个人抢5个红包,可重复抢,用多线程程序实现,实现方式有多种,分享一下我的思路:应用了阻塞队列的特性。/**
- 字符串每隔4位加空格今天弄了个银行卡识别功能,回显的时候想要将银行卡号每四位加一个空格,这样核对卡号会方便很多,这里记录一下1.正则表达式实
- 一、基本概念C#只有两种数据类型:值类型和引用类型值类型在线程栈分配空间,引用类型在托管堆分配空间值类型转为引用类型称成为装箱,引用类型转为
- 本文实例讲述了Java实现打印二叉树所有路径的方法。分享给大家供大家参考,具体如下:问题:给一个二叉树,把所有的路径都打印出来。比如,对于下
- 上篇文章给大家介绍了springboot全局字符编码设置解决乱码问题 感兴趣的朋友可以点击查看,下面通过两种方式给大家介绍Spri
- 前言最近接手的项目里涉及到了 GIF 动图的播放与监听,在上一版本中对于 GIF 的处理是由 H5 来实现的,因为考虑到用户体验,因此现在的
- 由于要做一个新项目,所以打算做一个简单的图片验证码。先说说思路吧:在服务端,从一个文件夹里面找出8张图片,再把8张图片合并成一张大图,在8个
- 第三章 字符串,比较器和过滤器JDK引入的一些方法对写出函数式风格的代码很有帮助。JDK库里的一些的类和接口我们已经用得非常熟悉了,比如说S
- 普通商户分账功能分账比例:目前只有”低比例分账“小于等于30%分账,分账金额需要减去(千6)手续费.每一张订单只能分发,当前订单总额的百分之