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