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

网友投稿 292 2022-07-24


目录JPA双向多对多关联关系@ManyToManyManyToMany和OneToMany的双向控制1、ManyToMany2、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 items = new HashSet();

@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 getItems() {

return items;

}

public void setItems(Set items) {

this.items = items;

}http://

}

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 categorys = new HashSet();

@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(namehttp://="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 getCategorys() {

return categorys;

}

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


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Java项目实现定时任务的三种方法
下一篇:使用SpringDataJpa创建中间表
相关文章

 发表评论

暂时没有评论,来抢沙发吧~