Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 可以向@ManyToMany Hibernate额外表添加额外字段吗?_Java_Hibernate - Fatal编程技术网

Java 可以向@ManyToMany Hibernate额外表添加额外字段吗?

Java 可以向@ManyToMany Hibernate额外表添加额外字段吗?,java,hibernate,Java,Hibernate,我有这两个班(桌子) @实体 @表(name=“course”) 公共课{ @身份证 @列(name=“courseid”) 私有字符串; @列(name=“coursename”) 私有字符串courseName; @列(name=“vahed”) 私家车; @列(name=“coursedep”) 私人内部事务部; @ManyToMany(fetch=FetchType.LAZY) @JoinTable(name=“student\u course”,joinColumns=@JoinCol

我有这两个班(桌子)

@实体
@表(name=“course”)
公共课{
@身份证
@列(name=“courseid”)
私有字符串;
@列(name=“coursename”)
私有字符串courseName;
@列(name=“vahed”)
私家车;
@列(name=“coursedep”)
私人内部事务部;
@ManyToMany(fetch=FetchType.LAZY)
@JoinTable(name=“student\u course”,joinColumns=@JoinColumn(name=“course\u id”),inverseJoinColumns=@JoinColumn(name=“student\u id”))
private Set student=new HashSet();
//一些二传手和接球手
还有这个:

    @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
@实体
@表(name=“student”)
公立班学生{
@身份证
@列(name=“studid”)
私人字符串stId;
@列(null=false,name=“studname”)
私有字符串名称;
@列(name=“stmajor”)
私有字符串stMajor;
@列(name=“stlevel”,长度=3)
私有字符串stLevel;
@列(name=“stdep”)
私人国际运输署;
@ManyToMany(fetch=FetchType.LAZY)
@JoinTable(name=“学生\课程”
,joinColumns=@JoinColumn(name=“student\u id”)
,inverseJoinColumns=@JoinColumn(name=“课程id”)
)
private Set course=new HashSet();
//一些二传手和接球手
运行此代码后,在数据库(学生课程)中创建了一个额外的表,现在我想知道如何在该表中添加额外字段,如(成绩、日期和…(我是指学生课程表)) 我看到了一些解决方案,但我不喜欢它们,而且我对它们也有一些问题:


学生课程表仅用于记录两个实体之间的关联。它由hibernate管理,不能包含其他数据


您想要记录的数据类型需要建模为另一个实体。也许您可以在Course和StudentResult(包含成绩等)之间建立一对多的关联,然后是StdentResult和Student之间的多对一关联。

删除多对多关联,创建一个名为StudentCourseRelationship的类,并在Student和Course to StudentCourseRelationship上设置一对多关联

你可以在上面写上各种各样的东西,比如DateEnrolled,DateKickedOut等等


在我看来,多对多映射是一个缺点。

如果在链接表(学生课程)上添加额外字段,则必须根据skaffman的答案或下面所示的其他方法选择一种方法

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

@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>();

}
公共班级学生{
@收藏费
@可接合(
table=@table(name=“STUDENT\u课程”),
joinColumns=@JoinColumn(name=“STUDENT\u ID”)
)
private Set joined=new HashSet();
}
公共课{
@收藏费
@可接合(
table=@table(name=“STUDENT\u课程”),
joinColumns=@JoinColumn(name=“课程ID”)
)
private Set joined=new HashSet();
}
请记住:@Embeddeble类的生命周期绑定到所属实体类(学生和课程),所以请注意它

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


关于,

不幸的是,接受的答案对我不起作用,hibernate以一种奇怪的方式生成联接表(所有联接列都是重复的)。但是,带有连接表专用实体的变体工作正常。这里对其进行了详细描述:

DateGotToGripsWithAssociations如何?:)回答得很好。如果只需要一个索引列来映射到列表,就可以添加@OrderColumn,但当我尝试上述解决方案时,我在集合映射中得到了
重复列错误。有什么想法吗?我和Ankur Raiyani遇到了同样的错误,我的解决方案是skaffman。在studentcourse中使用嵌入式id来确保我有正确的主键。然后我移除了嵌入式键,并为每个manToOne抛出一个@idrelation@AnkurRaiyani修复了。它的出现是因为2个属性-Student.joined和JoinedStudentCourse.student-管理同一列。由于Hibernate只能管理一个属性,因此应使用insertable=false、Updateable=false禁用一个属性。这同样适用于Course.joined和JoinedStudentCourse。course@Eyad易卜拉欣(见Ankur RaiyaniYou对评论的回复)可以使用\@OrderC添加一个额外的列column是一个int列,用于存储多个关系的排序顺序。我希望他们也能添加\@TempolalColumns来添加fromDate和toDate字段
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>();

}