Many-to-Many mapping is usually implemented a Join Table, suppose we have Type and Reason table and Reason table for many-to-many mapping. Every Type can have more than one Reasons and every Reasons is a part of more than one Type.
CREATE TABLE `rtrn_tp` (
`rtrn_tp_cd` VARCHAR(20) NOT NULL DEFAULT '',
`rtrn_tp_nm` VARCHAR(100) NULL DEFAULT NULL,
`sort_num` INT(11) UNSIGNED NOT NULL DEFAULT '0',
PRIMARY KEY (`rtrn_tp_cd`)
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB
;
CREATE TABLE `rtrn_rsn` (
`rtrn_rsn_cd` VARCHAR(20) NOT NULL DEFAULT '',
`rtrn_rsn_nm` VARCHAR(100) NULL DEFAULT NULL,
`sort_num` INT(11) UNSIGNED NOT NULL DEFAULT '0',
PRIMARY KEY (`rtrn_rsn_cd`)
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB
;
CREATE TABLE `rtrn_tp_rsn_cmbn` (
`rtrn_tp_cd` VARCHAR(20) NOT NULL DEFAULT '',
`rtrn_rsn_cd` VARCHAR(20) NOT NULL DEFAULT '',
PRIMARY KEY (`rtrn_tp_cd`, `rtrn_rsn_cd`),
INDEX `fk_rtrn_rsn` (`rtrn_rsn_cd`),
CONSTRAINT `fk_rtrn_rsn` FOREIGN KEY (`rtrn_rsn_cd`) REFERENCES `rtrn_rsn` (`rtrn_rsn_cd`),
CONSTRAINT `fk_rtrn_tp` FOREIGN KEY (`rtrn_tp_cd`) REFERENCES `rtrn_tp` (`rtrn_tp_cd`)
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB
;
There is a Join Table, RTRN_TP_RSN_CMBN, only have the relationship between Type (RTRN_TP) and Reason (RTRN_RSN)
package com.ns.spring.model;
import java.util.HashSet;
import java.util.Set;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.Table;
@Entity
@Table(name = "RTRN_TP")
public class RTRN_TP {
@Id
@Column(name = "rtrn_tp_cd")
private String rtrnTpCd;
@Column(name = "rtrn_tp_nm")
private String rtrnTpNm;
@Column(name = "sort_num")
private int sortNum;
@ManyToMany(targetEntity = RTRN_RSN.class, cascade = { CascadeType.ALL })
@JoinTable(name = "RTRN_TP_RSN_CMBN",
joinColumns = { @JoinColumn(name = "rtrn_tp_cd") },
inverseJoinColumns = { @JoinColumn(name = "rtrn_rsn_cd") })
private Set<RTRN_RSN> rtrnRsns = new HashSet<RTRN_RSN>();
public String getRtrnTpCd() {
return rtrnTpCd;
}
public void setRtrnTpCd(String rtrnTpCd) {
this.rtrnTpCd = rtrnTpCd;
}
public String getRtrnTpNm() {
return rtrnTpNm;
}
public void setRtrnTpNm(String rtrnTpNm) {
this.rtrnTpNm = rtrnTpNm;
}
public int getSortNum() {
return sortNum;
}
public void setSortNum(int sortNum) {
this.sortNum = sortNum;
}
public Set<RTRN_RSN> getRtrnRsns() {
return rtrnRsns;
}
public void setRtrnRsns(Set<RTRN_RSN> rtrnRsns) {
this.rtrnRsns = rtrnRsns;
}
public String toString() {
return "Type Code:" + this.rtrnTpCd + ", Name:" + this.rtrnTpNm;
}
}
package com.ns.spring.model;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
@Entity
@Table(name = "RTRN_RSN")
public class RTRN_RSN {
@Id
@Column(name = "rtrn_rsn_cd")
private String rtrnRsnCd;
@Column(name = "rtrn_rsn_nm")
private String rtrnRsnNm;
@Column(name = "sort_num")
private int sortNum;
public String getRtrnRsnCd() {
return rtrnRsnCd;
}
public void setRtrnRsnCd(String rtrnRsnCd) {
this.rtrnRsnCd = rtrnRsnCd;
}
public String getRtrnRsnNm() {
return rtrnRsnNm;
}
public void setRtrnRsnNm(String rtrnRsnNm) {
this.rtrnRsnNm = rtrnRsnNm;
}
public int getSortNum() {
return sortNum;
}
public void setSortNum(int sortNum) {
this.sortNum = sortNum;
}
public String toString() {
return "Reason Code:" + this.rtrnRsnCd + ", Name:" + this.rtrnRsnNm;
}
}
package com.ns.spring.model;
import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
@Entity
@Table(name = "RTRN_TP_RSN_CMBN")
public class RTRN_TP_RSN_CMBN implements Serializable {
private static final long serialVersionUID = 4677612728077605784L;
@Id
@Column(name = "rtrn_tp_cd")
private String rtrnTpCd;
@Id
@Column(name = "rtrn_rsn_cd")
private String rtrnRsnCd;
public String getRtrnTpCd() {
return rtrnTpCd;
}
public void setRtrnTpCd(String rtrnTpCd) {
this.rtrnTpCd = rtrnTpCd;
}
public String getRtrnRsnCd() {
return rtrnRsnCd;
}
public void setRtrnRsnCd(String rtrnRsnCd) {
this.rtrnRsnCd = rtrnRsnCd;
}
public String toString() {
return "Type" + this.rtrnTpCd + ", Reason:" + this.rtrnRsnCd;
}
}
@RequestMapping(value = "/cUrlValAttrbSubTpRsn01Jsp", params = "toBoundRsnList", method = RequestMethod.POST)
public ModelAndView toBoundRsnList(@ModelAttribute("RtrnTpModel") RtrnTpModel tp, ModelMap model, HttpServletRequest req) {
String tpSelected = (String) req.getSession().getAttribute(CONST.TP_SELECTED.getVal());
if (CommonBL.hasValue(tpSelected)) {
RTRN_TP tpObj = this.tpSvc.findById(tpSelected);
if (tpObj != null) {
List<String> selectedCheckBox = TpRsnBL.getRsnToBound(tp, req);
if (!CommonBL.isEmpty(selectedCheckBox)) {
Set<RTRN_RSN> rtrnRsns = new HashSet<RTRN_RSN>();
for (String code : selectedCheckBox) {
RTRN_RSN rsnObj = this.rsnSvc.findById(code);
if (rsnObj != null) {
rtrnRsns.add(rsnObj);
tpObj.setRtrnRsns(rtrnRsns);
this.tpSvc.saveOrUpdate(tpObj);
}
}
}
}
}
return getMVSubTpRsn01(model, req);
}
This is how to use Many to Many in Spring MVC.