使用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


猜你喜欢
- 在项目中遇到try...catch...语句,因为对Java异常处理机制的流程不是很清楚,导致对相关逻辑代码不理解。所以现在来总结Java异
- 项目已经添加了svn,但右键项目时找不到Svn选择但在VCS中却有,很奇怪这个问题是svn的根路径与当前IDEA打开的项目路径不一致的原因在
- 最近研究了下Java socket通信基础,利用代码实现了一个简单的多人聊天室功能,现把代码共享下,希望能帮到有兴趣了解的人。目录结构:Ch
- 这几天做项目,有些地方的图片需要用到圆形图片,所以百度了一下,在github上找到一个开源项目,处理很简单,效果如下: 使用起来特
- 一、前言Hello,又见面了,今天分享如何使用Unity制作计算器,难度中等,可以用来学习,或者当成其他项目的小组件导入。当然,也可以导出来
- 本文实例为大家分享了Android列表时间轴展示的具体代码,供大家参考,具体内容如下实现的效果图如下:实现的方式是利用recycleview
- 很多主流框架都使用了反射技术.像ssh框架都采用两种技术 xml做配置文件+反射技术.与反射有关的类包.java.lang.reflect.
- 一、什么是JSONJSON: JavaScript Object Notation JS对象简谱,是一种类似于XML的语言。相比于XML,它
- 温馨提示:本教程的 GitHub 地址为「intellij-idea-tutorial」,欢迎感兴趣的童鞋Star、Fork,纠错。首先,给
- 方法重写与之前的方法重载不同回顾一下方法重载,相同的方法名不同参数类型和参数数量以及参数顺序package Demo1;import jav
- 在c++当中,标准类型string来代表可变长的字符串序列,使用string需要加载string 头文件,而方法定义在命名空间std当中,所
- 使用的是iTextSharp添加PDF水印,由于是接口动态生成PDF,所以采用的是全部是内存流的形式,而且水印是平铺是。iTextSharp
- hello, everyone. Long time no see. 本期文章,我们主要讲解一下二叉树的相关概念,顺便也把搜索二叉树(也叫二
- 什么是Dozer?Dozer是一种Java Bean到Java Bean的映射器,递归地将数据从一个对象复制到另一个对象,它是一个强大的,通
- 先看实例 代码如下 classip { privatestaticlongiptolong(stringstrip) //将127.0.0.
- 本文主要是分析Spring bean的循环依赖,以及Spring的解决方式。 通过这种解决方式,我们可以应用在我们实际开发项目中。1. 什么
- 本文实例为大家分享了Android实现语音播放与录音的具体代码,供大家参考,具体内容如下项目用到的技术点和亮点语音录音 (单个和列表)语音播
- 前言:mybatisplus 可以说是对mybatis更好的拓展,一些简单的增删改查的操作已经被作者实现,我们只需引用即可。1.数据库建表这
- 这篇文章主要介绍了Java自定义实现equals()方法过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值
- 本文实例为大家分享了Android实现记住账号密码的具体代码,供大家参考,具体内容如下布局一个复选框<CheckBox