我有一个按以下方式建模的现有数据库:
学生 - SchoolId(PK)
、StudentId(PK)
、StudentName
教师 - SchoolId(PK)
、TeacherId(PK)
、TeacherName
Student_Teacher - SchoolId(PK)
、StudentId(PK)
、TeacherId(PK)
存在从 Student_Teacher
到各个实体的外键引用。
现在我正在为这个现有数据库创建 hibernate 实体。我在创建从学生到教师的多对多映射时遇到了奇怪的问题。
@Entity
@Table(name = "Student")
public class Student {
@EmbeddableId
private StudentPK itemId;
@Column(name="StudentName")
private String studentName;
@ManyToMany(cascade = CascadeType.ALL)
@JoinTable(name="Student_Teacher", joinColumns={@JoinColumn(name="SchoolId", referencedColumnName="SchoolId"),@JoinColumn(name="StudentId", referencedColumnName="StudentId")}, inverseJoinColumns={@JoinColumn(name="SchoolId", referencedColumnName="SchoolId"),@JoinColumn(name="TeacherId", referencedColumnName="TeacherId")})
private List<Teacher> attachments=new ArrayList<Teacher>();
}
上面的代码提示一些重复的 SchoolId
引用。
有什么想法吗?
最佳答案
据我所知,您的实体映射存在问题,应该如下所示
学校 - school_id(PK)
、school_name
学生 - student_id(PK)
、student_name
、fk_school_id(FK)
,
老师 - teacher_id(PK)
、teacher_name
、fk_school_id(FK)
>
*student_teacher* - student_teacher_id(PK)
、fk_student_id(FK)
、fk_teacher_id(FK)
实体类如下
学校实体
@Entity
@Table(name = "school")
public class School {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column (name = "school_id")
private int Id;
@Column(name="school_name")
private String schoolName;
@OneToMany(fetch = FetchType.LAZY, mappedBy = "school")
private Set<Student> students = new HashSet<Student>
@OneToMany(fetch = FetchType.LAZY, mappedBy = "school")
private Set<Teacher> teachers = new HashSet<Teacher>
}
学生实体
@Entity
@Table(name = "student")
public class Student {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column (name = "student_id")
private int Id;
@Column(name="student_name")
private String studentName;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "school_id", nullable = false)
private School school;
@ManyToMany(cascade = CascadeType.ALL)
@JoinTable(name = "student_teacher", joinColumns = {@JoinColumn(name = "fk_student_id") }, inverseJoinColumns = { @JoinColumn(name = "fk_teacher_id") })
private List<Teacher> teachers = new ArrayList<Teacher>();
}
教师实体
@Entity
@Table(name = "teacher")
public class Teacher {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column (name = "teacher_id")
private int Id;
@Column(name="teacher_name")
private String name;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "school_id", nullable = false)
private School school;
@ManyToMany(cascade = CascadeType.ALL)
@JoinTable(name = "student_teacher", joinColumns = {@JoinColumn(name = "fk_teacher_id") }, inverseJoinColumns = { @JoinColumn(name = "fk_student_id") })
private List<Student> students =new ArrayList<Student>();
}
希望这能解决这个问题..
由于您已在 Student_Teacher 表中将 'SchoolId' 声明为 PK,因此不允许您添加Student_Teacher 表的 SchoolId 字段有重复条目,但情况并非如此。因此,上述关系将提供重复的 SchoolId 引用。当您要将同一学校的两名不同学生添加到 Student_Teacher 表中时..
关于java - Hibernate 多对多映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18611787/