前言
JPA是Java Persistence API的簡(jiǎn)稱,中文名Java持久層API,是JDK 5.0注解或XML描述對(duì)象-關(guān)系表的映射關(guān)系,并將運(yùn)行期的實(shí)體[對(duì)象持久化]到數(shù)據(jù)庫(kù)中。
Sun引入新的JPA ORM規(guī)范出于兩個(gè)原因:其一,簡(jiǎn)化現(xiàn)有Java EE和Java SE應(yīng)用開發(fā)工作;其二,Sun希望整合ORM技術(shù),實(shí)現(xiàn)天下歸一。(出自百度百科)
JPA優(yōu)點(diǎn):上手快,使用簡(jiǎn)單。
JPA缺點(diǎn):不適合關(guān)聯(lián)關(guān)系復(fù)雜的項(xiàng)目。
正題
正常情況下使用@ManyToMany注解描述多對(duì)多關(guān)系時(shí),JPA自動(dòng)生成的表中是只包括兩個(gè)對(duì)應(yīng)實(shí)體的主鍵信息的。有些時(shí)候呢,就會(huì)遇到需要在關(guān)聯(lián)表中加入想要的其他字段來(lái)輔助完成需求。比如部門與部門人之間關(guān)系。一個(gè)部門有多個(gè)人,一個(gè)又可以屬于多個(gè)部門,一個(gè)人在不同的部門之間有不同的身份,在做展示的時(shí)候就涉及排序問(wèn)題,一個(gè)人在不同的部門擁有不一樣的排序。
這里以老師,學(xué)生,老師對(duì)每個(gè)學(xué)生的印象分來(lái)進(jìn)行編碼。主體思路就是將@ManyToMany生成的關(guān)系表單獨(dú)作為一個(gè)類,使用兩個(gè)@ManyToOne來(lái)進(jìn)行實(shí)現(xiàn)。
一、老師實(shí)體類
package com.ysh.springboot.permissions.test;
import java.util.List;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import lombok.Getter;
import lombok.Setter;
/**
*
* @author ysh
* @date 2020/01/03
*/
@Entity
@Table(name = "teacher")
@Getter
@Setter
public class Teacher {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
@Column(name = "name")
private String name;
@Column(name = "age")
private int age;
@OneToMany(mappedBy = "teacher", fetch = FetchType.EAGER,cascade = CascadeType.ALL)
private List<TeacherStudent> teacherStudents;
}
二、學(xué)生實(shí)體類
package com.ysh.springboot.permissions.test;
import java.util.List;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import lombok.Getter;
import lombok.Setter;
/**
*
* @author ysh
* @date 2020/01/03
*/
@Entity
@Table(name = "student")
@Getter
@Setter
public class Student {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
@Column(name = "name")
private String name;
@OneToMany(mappedBy="student", fetch = FetchType.EAGER,cascade=CascadeType.ALL)
private List<TeacherStudent> teacherStudents;
}
三、老師對(duì)學(xué)生印象分類
package com.ysh.springboot.permissions.test;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
import lombok.Getter;
import lombok.Setter;
/**
*
* @author ysh
* @date 2020/01/03
*/
@Entity
@Table(name = "teacher_student")
@Getter
@Setter
public class TeacherStudent {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
@ManyToOne(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
@JoinColumn(name = "t_id")
private Teacher teacher;
@ManyToOne(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
@JoinColumn(name = "s_id")
private Student student;
@JoinColumn()
@Column(nullable=true,name="impression_score")
private int impressionScore;
}
四、表生成結(jié)構(gòu)

五、使用
通過(guò)關(guān)系表類來(lái)獲取需要的輔助字段。