如何使用JPA注解标注多对多的关系
假設應用場景如下:Teacher與Student是多對多的關系,其中,Teacher類對應teacher表如下:
CREATE TABLE `teacher` (? `id` bigint(20) NOT NULL AUTO_INCREMENT,
? `name` varchar(50) DEFAULT NULL,
? PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;
Student類對應student表如下:
CREATE TABLE `student` (? `id` bigint(20) NOT NULL AUTO_INCREMENT,
? `name` varchar(50) DEFAULT NULL,?
? PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;
中間表teacher_student表如下:
CREATE TABLE `teacher_student` (? `id` bigint(20) NOT NULL AUTO_INCREMENT,
? `teacher_id` bigint(20) NOT NULL ,
? `student_id` bigint(20) NOT NULL ,
? PRIMARY KEY (`id`),
? KEY `fk_reference_50` (`teacher_id`),
? CONSTRAINT `fk_reference_50` FOREIGN KEY (`teacher_id`) REFERENCES `teacher` (`id`),
? KEY `fk_reference_60` (`teacher_id`),
? CONSTRAINT `fk_reference_60` FOREIGN KEY (`student_id`) REFERENCES `student` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;
Student類如下:
public class Student{?? ? //對應的教師集合
?? ?private Set<Teacher> teachers = new HashSet<Teacher>();
?? ?/*? ?
?? ? * @ManyToMany 注釋表示Student是多對多關系的一邊,mappedBy 屬性定義了Student 為雙向關系的維護端? ?
?? ? */? ?
?? ?@ManyToMany(mappedBy = "students")? ?
?? ?public Set<Teacher> getTeachers() {? ?
?? ? ? ?return teachers;? ?
?? ?}? ?
??
?? ?public void setTeachers(Set<Teacher> teachers) {? ?
?? ? ? ?this.teachers = teachers;? ?
?? ?}? ?
}
說明
1、該類經過簡化,沒有列出全部代碼,在此我們只關注ManyToMany注解及其屬性設置。
其他屬性說明參加上篇文章:如何使用JPA注解標注一對一的關系
public class Teacher implements Serializable {? ??? // 對應的學生集合
?? ?private Set<Student> students = new HashSet<Student>();
??
?? ?/*? ?
?? ? * @ManyToMany 注釋表示Teacher 是多對多關系的一端。? ?
?? ? * @JoinTable 描述了多對多關系的數據表關系,name屬性指定中間表名稱。? ?
?? ? * joinColumns 定義中間表與Teacher 表的外鍵關系,中間表teacher_student的teacher_id 列是 teacher 表的主鍵列對應的外鍵列。? ?
?? ? * inverseJoinColumns 屬性定義了中間表與另外一端(Student)的外鍵關系。? ?
?? ? */? ?
?? ?@ManyToMany(cascade = CascadeType.PERSIST, fetch = FetchType.LAZY)? ?
?? ?@JoinTable(name = "teacher_student",
?? ? ? ? ? ?joinColumns ={@JoinColumn(name = "teacher_id", referencedColumnName = "id") },? ? ?
?? ? ? ? ? ?inverseJoinColumns = { @JoinColumn(name = "student_id", referencedColumnName = "id")? ? ?
?? ?})? ?
?? ?public Set<Student> getStudents() {? ?
?? ? ? ?return students;? ?
?? ?}? ?
??
?? ?public void setStudents(Set<Student> students) {? ?
?? ? ? ?this.students = students;? ?
?? ?}? ?
}
說明:
1、@JoinTable
@JoinTable注解定義了聯接表的表名,連接列數組,以及invers連接列數組。invers連接列數組是關聯表中關聯到student表主鍵的列(the “other side”)。
被關聯端(Student)不必也不能描述物理映射:只需要一個簡單的mappedBy參數,該參數包含了主體端(Teacher)的屬性名,這樣就綁定了雙方的關系。
默認值:
和其它許多注解一樣,在多對多關聯中很多值是自動生成,當雙向多對多關聯中沒有定義任何物理映射時,Hibernate根據以下規則生成相應的值:
關聯表名:主表表名+下劃線+從表表名;
關聯到主表的外鍵名:主表名+下劃線+主表中的主鍵列名;
關聯到從表的外鍵名:主表中用于關聯的屬性名+下劃線+從表的主鍵列名。
以上規則對于雙向一對多關聯同樣一樣。
轉載于:https://www.cnblogs.com/shihao/archive/2012/06/21/2558333.html
總結
以上是生活随笔為你收集整理的如何使用JPA注解标注多对多的关系的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 输卵管不通跳绳怀孕了
- 下一篇: JavaScript基本知识