是否可以向@ManyToMany休眠额外表添加额外的字段?

2022-09-03 12:29:44

我有这两个类(表)

@Entity
@Table(name = "course")
public class Course {

    @Id
    @Column(name = "courseid")
    private String courseId;
    @Column(name = "coursename")
    private String courseName;
    @Column(name = "vahed")
    private int vahed;
    @Column(name = "coursedep")
    private int dep;
    @ManyToMany(fetch = FetchType.LAZY)
    @JoinTable(name = "student_course", joinColumns = @JoinColumn(name = "course_id"),  inverseJoinColumns = @JoinColumn(name = "student_id"))
    private Set<Student> student = new HashSet<Student>();
//Some setter and getter

和这个:

    @Entity
    @Table(name = "student")
    public class Student {

        @Id
        @Column(name="studid")
        private String stId;
        @Column(nullable = false, name="studname")
        private String studName;
        @Column(name="stmajor")
        private String stMajor;
        @Column(name="stlevel", length=3)
        private String stLevel;
        @Column(name="stdep")
        private int stdep;

        @ManyToMany(fetch = FetchType.LAZY)
        @JoinTable(name = "student_course"
                ,joinColumns = @JoinColumn(name = "student_id")
                ,inverseJoinColumns = @JoinColumn(name = "course_id")
        )
        private Set<Course> course = new HashSet<Course>();
//Some setter and getter

运行此代码后,在数据库中创建了一个额外的表(student_course),现在我想知道如何在此表中添加额外的字段,例如(成绩,日期和...(我的意思是student_course表))我看到一些解决方案,但我不喜欢它们,我也对它们有一些问题:

第一个示例


答案 1

如果在链接表(STUDENT_COURSE)上添加额外的字段,则必须根据skaffman的答案选择一种方法或另一种方法,如波纹管所示。

有一种方法,其中链接表(STUDENT_COURSE)的行为类似于@Embeddable,根据以下条件:

@Embeddable
public class JoinedStudentCourse {

    // Lets suppose you have added this field
    @Column(updatable=false)
    private Date joinedDate;

    @ManyToOne(fetch=FetchType.LAZY)
    @JoinColumn(name="STUDENT_ID", insertable=false, updatable=false)
    private Student student;

    @ManyToOne(fetch=FetchType.LAZY)
    @JoinColumn(name="COURSE_ID", insertable=false, updatable=false)
    private Course course;

    // getter's and setter's 

    public boolean equals(Object instance) {
        if(instance == null)
            return false;

        if(!(instance instanceof JoinedStudentCourse))
            return false;

        JoinedStudentCourse other = (JoinedStudentCourse) instance;
        if(!(student.getId().equals(other.getStudent().getId()))
            return false;

        if(!(course.getId().equals(other.getCourse().getId()))
            return false;

        // ATT: use immutable fields like joinedDate in equals() implementation
        if(!(joinedDate.equals(other.getJoinedDate()))
            return false;

        return true;
    }

    public int hashcode() {
        // hashcode implementation
    }

}

因此,您将在学生和课程课程中都有

public class Student {

    @CollectionOfElements
    @JoinTable(
        table=@Table(name="STUDENT_COURSE"),
        joinColumns=@JoinColumn(name="STUDENT_ID")
    )
    private Set<JoinedStudentCourse> joined = new HashSet<JoinedStudentCourse>();

}

public class Course {

    @CollectionOfElements
    @JoinTable(
        table=@Table(name="STUDENT_COURSE"),
        joinColumns=@JoinColumn(name="COURSE_ID")
    )
    private Set<JoinedStudentCourse> joined = new HashSet<JoinedStudentCourse>();

}

请记住:@Embeddable类的生命周期绑定到所属实体类(学生和课程),因此请妥善处理。

建议:Hibernate团队支持这两种方法(@OneToMany(skaffman的答案)或@CollectionsOfElements),因为@ManyToMany映射 - 级联操作中存在一些限制。

问候


答案 2

student_course表纯粹是为了记录两个实体之间的关联。它由休眠状态管理,不能包含任何其他数据。

要记录的数据类型需要建模为另一个实体。也许你可以在课程和学生结果(包含成绩等)之间建立一对多的关联,然后在StdentResult和Student之间进行多对一的关联。


推荐