java - Hibernate 多对多映射

标签 java entity-framework hibernate

我有一个按以下方式建模的现有数据库:

学生 - 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_namefk_school_id(FK),

老师 - teacher_id(PK)teacher_namefk_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/

相关文章:

c# - 使用 Entity Framework 从 2 个表返回数据

java - Hibernate后端条件查询包含: where(1=1) what does it means?

java - MySQL 触发器或存储过程可以用 Java 编写吗?

java - Google Sheets API 的表格是否自动更新

java - 从半角片假名转换为全角片假名

c# - Fluent Api中的等价显示Annotation是什么?

c# - EntityFramework Core - 复制实体并将其放回数据库

java - 在 hibernate 中从 session.createQuery 获取超过 1 个对象

java - Hibernate创建SQL查询在WHERE子句中连接多个查询

java - 构造函数和数组列表