我有这两个课(表)
@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)中创建了一个额外的表,现在我想知道如何在该表中添加额外的字段,例如(Grade,Date和…(我的意思是student_course表)),我看到了一些解决方案,但我不喜欢它们,而且我对它们有一些问题:
第一个样品
如果在链接表(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类的生命周期绑定到拥有的实体类(Student和Course),因此请多加注意。
建议:由于@ManyToMany映射中的某些限制- 级联操作,Hibernate团队支持这两种方法(@OneToMany(skaffman的答案)或@CollectionsOfElements)。
问候,