使用JPA双向多对多关联关系@ManyToMany

 更新时间:2022年06月13日 09:34:39   作者:qq_36722039  
这篇文章主要介绍了使用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一样。经过试验,不指定还会造成级联查找失败,原因未知。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • java中char对应的ASCII码的转化操作

    java中char对应的ASCII码的转化操作

    这篇文章主要介绍了java中char对应的ASCII码的转化操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-08-08
  • java switch语句使用注意的四大细节

    java switch语句使用注意的四大细节

    很多朋友在使用java switch语句时,可能没有注意到一些细节,本文将详细介绍使用java switch语句四大要点,需要的朋友可以参考下
    2012-12-12
  • spring cloud中Feign导入jar失败的问题及解决方案

    spring cloud中Feign导入jar失败的问题及解决方案

    这篇文章主要介绍了spring cloud中Feign导入jar失败的问题及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03
  • Spring boot详解缓存redis实现定时过期方法

    Spring boot详解缓存redis实现定时过期方法

    本篇文章分享的就是spring boot中的一个轮子,spring cache注解的方式实现接口数据缓存。默认的配置想非常简单,但是有一个弊端是缓存数据为永久缓存,本次将介绍如何设置接口缓存数据的过期时间
    2022-07-07
  • 教你怎么用Java回溯算法解数独

    教你怎么用Java回溯算法解数独

    一直不太会数独问题,这次下决定搞明白,所以整理了本篇文章,文中有非常详细的代码示例,对不会算法的小伙伴们很有帮助,需要的朋友可以参考下
    2021-06-06
  • SpringBoot应用监控Actuator使用隐患及解决方案

    SpringBoot应用监控Actuator使用隐患及解决方案

    SpringBoot的Actuator 模块提供了生产级别的功能,比如健康检查,审计,指标收集,HTTP 跟踪等,帮助我们监控和管理Spring Boot 应用,本文将给大家介绍SpringBoot应用监控Actuator使用隐患及解决方案,需要的朋友可以参考下
    2024-07-07
  • 使用SpringBoot动态切换数据源的实现方式

    使用SpringBoot动态切换数据源的实现方式

    在我们企业项目开发的过程中,有的时候,一个项目需要在运行时,根据某种条件选择使用哪个数据源,那么此时该怎么进行动态切换呢,本文给大家例举一种常见的实现方式,文中有详细的实现步骤,需要的朋友可以参考下
    2023-12-12
  • SpringBoot整合Redis的哨兵模式的实现

    SpringBoot整合Redis的哨兵模式的实现

    Redis提供了哨兵模式来处理主从切换和故障转移,本文主要介绍了SpringBoot整合Redis的哨兵模式的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-08-08
  • 小议Java中final关键字使用时的注意点

    小议Java中final关键字使用时的注意点

    final关键字代表着最后、不可改变,无论是在用final修饰类、修饰方法还是修饰变量时,都要注意内存分配的问题.这里来小议Java中final关键字使用时的注意点:
    2016-06-06
  • 在IDEA中创建跑得起来的Springboot项目

    在IDEA中创建跑得起来的Springboot项目

    这篇文章主要介绍了在IDEA中创建跑得起来的Springboot项目的图文教程,需要的朋友可以参考下
    2018-04-04

最新评论