使用JPA雙向多對(duì)多關(guān)聯(lián)關(guān)系@ManyToMany
JPA雙向多對(duì)多關(guān)聯(lián)關(guān)系@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屬性設(shè)置中間表的表名
//joinCloums屬性在中間表中添加的列
//JoinColumns屬性:
// @joinColumn屬性設(shè)置中間表中的列名
// referencedColumnName屬性指向被映射表的主鍵(可以沒(méi)有該屬性)
//@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的雙向控制
下面我們使用權(quán)限管理中Role<->Account(用戶ManyToMany賬號(hào))、Role<->Domain(用戶OneToMany權(quán)限域)的關(guān)系來(lái)舉例?! ?/p>
1、ManyToMany
Role表

Account表

在兩個(gè)表的對(duì)應(yīng)屬性上添加JoinColumns和inverseJoinColumns,并且相互交換。
JoinColumn指定本表在中間表中的列名。inverseJoinColumns指定受控方的列名。
在兩個(gè)類中都加上這兩個(gè)屬性,并且值互換,則能夠?qū)崿F(xiàn)雙向控制,即任何一方刪除,都會(huì)自動(dòng)刪除對(duì)應(yīng)中間表的數(shù)據(jù)。
2、OneToMany以及ManyToOne
Role表

Domain表

cascade用來(lái)指定級(jí)聯(lián)操作, cascade的值只能從CascadeType.PERSIST(級(jí)聯(lián)新建)、CascadeType.REMOVE(級(jí)聯(lián)刪 除)、CascadeType.REFRESH(級(jí)聯(lián)刷新)、CascadeType.MERGE(級(jí)聯(lián)更新)中選擇一個(gè)或多個(gè)。還有一個(gè)選擇是使用CascadeType.ALL,表示選擇全部四項(xiàng)。
如果不指定Cascade,默認(rèn)是空的,那么在刪除Role的時(shí)候,只會(huì)把Domain表中的role這一列的值刪除,而該條記錄不刪除。
JoinColumn需要指定,如果不指定就會(huì)在Domain表中增加額外的一列,這一列與Domain的id一樣。經(jīng)過(guò)試驗(yàn),不指定還會(huì)造成級(jí)聯(lián)查找失敗,原因未知。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Windows下apache ant安裝、環(huán)境變量配置教程
這篇文章主要介紹了Windows下apache ant安裝、環(huán)境變量配置教程,ANT的安裝很簡(jiǎn)單,本文同時(shí)講解了驗(yàn)證安裝是否成功的方法和使用方法實(shí)例,需要的朋友可以參考下2015-06-06
Java實(shí)現(xiàn)茶葉售賣商城系統(tǒng)(java+SSM+JSP+EasyUi+mysql)
這篇文章主要介紹了基于SSM框架實(shí)現(xiàn)的一個(gè)茶葉售賣商城系統(tǒng),應(yīng)用到的技術(shù)有Jsp、SSM 、EasyUi,文中的示例代碼具有一定的學(xué)習(xí)價(jià)值,需要的朋友可以參考一下2021-12-12
Java刪除ArrayList中的重復(fù)元素的兩種方法
在Java編程中,ArrayList是一種常用的集合類,它允許我們存儲(chǔ)一組元素,在某些情況下,我們可能需要移除其中重復(fù)的元素,只保留唯一的元素,下面介紹兩種常見(jiàn)的刪除ArrayList中重復(fù)元素的方法,需要的朋友可以參考下2024-12-12
JAVA?Springboot配置i18n國(guó)際化語(yǔ)言詳細(xì)步驟
國(guó)際化(Internationalization,縮寫為i18n)是指根據(jù)來(lái)展示不同的內(nèi)容,使應(yīng)用程序能夠適應(yīng)不同的語(yǔ)言和文化習(xí)慣,下面這篇文章主要給大家介紹了關(guān)于JAVA?Springboot配置i18n國(guó)際化語(yǔ)言的詳細(xì)步驟,需要的朋友可以參考下2024-08-08
SpringBoot下使用定時(shí)任務(wù)的方式全揭秘(6種)
這篇文章主要介紹了SpringBoot下使用定時(shí)任務(wù)的方式全揭秘(6種),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-02-02
java 數(shù)據(jù)結(jié)構(gòu)單鏈表的實(shí)現(xiàn)
這篇文章主要介紹了java 數(shù)據(jù)結(jié)構(gòu)單鏈表的實(shí)現(xiàn)的相關(guān)資料,需要的朋友可以參考下2017-07-07
關(guān)于SpringCloud分布式系統(tǒng)中實(shí)現(xiàn)冪等性的幾種方式
這篇文章主要介紹了關(guān)于SpringCloud分布式系統(tǒng)中實(shí)現(xiàn)冪等性的幾種方式,冪等函數(shù),或冪等方法,是指可以使用相同參數(shù)重復(fù)執(zhí)行,并能獲得相同結(jié)果的函數(shù),這些函數(shù)不會(huì)影響系統(tǒng)狀態(tài),也不用擔(dān)心重復(fù)執(zhí)行會(huì)對(duì)系統(tǒng)造成改變,需要的朋友可以參考下2023-10-10

