JPA關(guān)聯(lián)關(guān)系表中加其他字段

前言

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)


表生成結(jié)構(gòu)

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容