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

目录
  • JPA双向多对多关联关系@ManyToMany
  • ManyToMany和OneToMany的双向控制
    • 1、ManyToMany
    • 2、OneToMany以及ManyToOne

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一样。经过试验,不指定还会造成级联查找失败,原因未知。

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

(0)

相关推荐

  • 基于Jpa中ManyToMany和OneToMany的双向控制

    目录 Jpa ManyToMany和OneToMany的双向控制 1.ManyToMany 2.OneToMany以及ManyToOne JPA中ManyToMany关系问题 解决办法 Jpa ManyToMany和OneToMany的双向控制 下面我们使用权限管理中Role<->Account(用户ManyToMany账号).Role<->Domain(用户OneToMany权限域)的关系来举例. 1.ManyToMany Role表 Account表 在两个表的对应属性上添加J

  • 解决使用@ManyToMany查询数据时的死循环问题

    目录 使用@ManyToMany查询数据时的死循环 一.在Role中加上@JsonIgnore注解 二.将双向关联改为单向关联 单向多对多@ManyToMany的使用和理解 使用@ManyToMany查询数据时的死循环 初学使用spring data jpa,将问题记录 以User 和Role为例,两者为双向的多对多关系,即可以通过User查询到Role信息,也可以通过Role查询到User信息 首先要明白为什么会出现死循环这个问题,造成这个死循环的原因是因为查询User时,包含了Role属性,

  • spring jpa ManyToMany原理及用法详解

    1.java和jpa 中所有的关系都是单向的.这个关系数据库不同,关系数据库,通过外键定义并查询,使得反向查询总是存在的. 2.JPA还定义了一个OneToMany关系,它与ManyToMany关系类似,但反向关系(如果已定义)是ManyToOne关系. OneToMany与JPA中ManyToMany关系的主要区别在于,ManyToMany总是使用中间关系连接表来存储关系, OneToMany可以使用连接表或者目标对象的表引用中的外键源对象表的主键. @OneToMany(cascade =

  • 详谈jpa中表的@OneToMany等关联关系

    目录 一.@OneToOne关系映射 1.通过外键的方式 2.通过关联表的方式来保存一对一的关系 二.@OneToMany 和 @ManyToOne 三.多对多 @ManyToMany 再次更新 One 端 Many 端 一.@OneToOne关系映射 JPA使用@OneToOne来标注一对一的关系. 实体 People :用户. 实体 Address:家庭住址. People 和 Address 是一对一的关系. 这里用两种方式描述JPA的一对一关系. 一种是通过外键的方式(一个实体通过外键关

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

    目录 JPA双向多对多关联关系@ManyToMany ManyToMany和OneToMany的双向控制 1.ManyToMany 2.OneToMany以及ManyToOne JPA双向多对多关联关系@ManyToMany package com.jpa.helloworld; import java.util.HashSet; import java.util.Set; import javax.persistence.Column; import javax.persistence.Ent

  • 详解hibernate双向多对多关联映射XML与注解版

    双向多对多关联映射原理: 假设,一个员工可能有多个角色,一个角色可能有多个员工,从员工或角色的角度看,这就是多对多的关系,不管从哪一个角度看,都是多对多的联系.多对多关联映射关系一般采用中间表的形式来实现,即新增一种包含关联双方主键的表.实现多对多关联关系,在数据库底层通过添加中间表指定关联关系,而在hibernate框架在双方的实体中添加一个保存对方的集合,在双方的映射文件中使用<set>元素和<many-to-many>元素进行关联关系的配置. 如下图所示: (1)XML版 R

  • jpa实现多对多的属性时查询的两种方法

    目录 jpa多对多的属性查询 第一:采用JPQL方式 第二:采用specification 方法 JPA,HQL多对多的查询语句 Hql语句 另外一种写法 jpa多对多的属性查询 第一:采用JPQL方式 使用@Query拼接jpql语句完成多对多的查询; @query( SELECT User FROM User u JOIN Student s on s.id = u.id where u.name LIKE :name ) User findallByName(@param("name&qu

  • Hibernate双向多对多映射关系配置代码实例

    1.实体类 package com.yl.bean; import java.io.Serializable; import java.util.Set; /** * 商品实体类 */ public class Goods implements Serializable { private Integer id;//商品id private String goodsName;//商品名 private Double price;//商品价格 private String remark;//备注

  • Spring Data JPA 实体类中常用注解说明

    目录 javax.persistence 介绍 基本注解 关联关系注解 关于关系查询的一些注意事项 javax.persistence 介绍 Spring Data JPA 采用约定大于配置的思想,默认了很多东西 JPA是存储业务实体关联的实体来源,它显示定义了如何定义一个面向普通Java对象(POJO)作为实体,以及如何与管理关系实体提供一套标准 javax.persistence位于hibernate-jpa-**.jar 包里面 jpa类层次结构: JPA类层次结构的显示单元: 单元 描述

  • java Hibernate多对多映射详解及实例代码

    java Hibernate多对多映射 前言: 一.单向多对多 单向多对多的例子用人和职位来举例,一个人可以有多个职位,一个职位会有多个人.单向多对多是指只能在一端来查询获取另一端的内容.多对多的关系在生成关系模型时会生成对象之前的关联表,关联表中存放着两个关系表的主键,它们的关系如下所示: 代码部分:  (1)映射和关系类 因为是单向的关系,所以只需要在一端进行维护,所以我们需要在User.hbm.xml配置文件中添加<many-to-many>标签,并在标签中加上对应的列关系,在<s

  • Django的数据模型访问多对多键值的方法

    这里先来借用一个书本(book)的数据模型作为例子: from django.db import models class Publisher(models.Model): name = models.CharField(max_length=30) address = models.CharField(max_length=50) city = models.CharField(max_length=60) state_province = models.CharField(max_lengt

  • django数据关系一对多、多对多模型、自关联的建立

    一对多模型 一对多的关系,例如员工跟部门.一个部门有多个员工.那么在django怎么建立这种表关系呢? 其实就是利用外键,在多的一方,字段指定外键即可.例如员工和部门,员工是多,所以在员工表直接部门即可. 示例(见19行): class Department(models.Model): name = models.CharField(max_length=20) create_data = models.DateField(auto_now_add=True) is_delete = mode

  • 关于Hibernate的一些学习心得总结

    对于Hibernate刚刚学习了一周时间了,作为一名java初学者,也有点自己的感受想分享出来,如果这篇文章能有幸被大家看到,也仅供大家娱乐.如果有什么不足之处,欢迎大家多多指点,多多批评.仅供参考,不喜勿喷. 前段时间刚学习了用JDBC来进行java和数据库的连接,来实现对数据的持久化操作和增删改查,但是学习完的感受就是JDBC过于繁琐,因为它无法直接面对对象,开发效率地,代码又多,还重复,完全不符合java面向对象的思维模式.Hibernate的诞生算是给java程序员很好地解决了这个问题,

随机推荐