Hibernate关系映射之多对多映射的两种方式

小鱼儿 2022-07-13 00:25 259阅读 0赞

多对多关系##

many-to-many
应用场景:不建议使用,建议拆解成两个“一对多”连接
关系定义(主控方):

  1. //xml映射方法
  2. <set name="propertyName" table="middle_table_name">
  3. <key column="columnName_master" />
  4. <many-to-many class="className" column="columnName_slave" />
  5. </set>
  6. //annotation注解映射方法
  7. @ManyToMany
  8. @JoinTable(name="middle_table_name"
  9. joinColumns=@JoinColumn(name="columnName_master",
  10. inverseJoinColumns=@JoinColumn(name="columnName_slave"))
  11. )

关系定义(被控方)

  1. //xml映射
  2. <set name="propertyName" table="middle_table_name">
  3. <key column="columnName_slave" />
  4. <many-to-many class="className" column="columnName_master" />
  5. </key>
  6. //annotation注解映射
  7. @ManyToMany(mappedBy="propertyName")

多对多映射代码##

说明:学生与学生之间的关系是多对多,一个学生可以对应多个教师,一个教师也可以对应多个学生。这里定义一个学生类Student和一个教师类Lecturer。
一.xml映射
1.新建Student.hbm.xml文件,在该文件里编写映射关系,Student为主控方。

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
  3. <hibernate-mapping>
  4. <class name="com.ffy.studentmanage.Student" table="student">
  5. <id name="id" column="id">
  6. <generator class="assigned"></generator>
  7. </id>
  8. <property name="sid" column="sid"></property>
  9. <property name="firstName" column="firstname"></property>
  10. <property name="lastName" column="lastname"></property>
  11. <property name="gender" column="gender"></property>
  12. <property name="phone" column="phone"></property>
  13. <property name="email" column="email"></property>
  14. <property name="dateOfBirth" column="date_of_birth"></property>
  15. //一个学生可以有多个老师,所以需要用集合来放教师类。
  16. //name:在student类中有一个存放类型为Lecturer的集合,这里的name为该set。table:学生和教师关系的中间表名称
  17. <set name="lecturers" table="student_has_teacher">
  18. //column:中间表的用于与student(我方)关联的外键。
  19. <key column="student_id"></key>
  20. //column:中间表的用于与lecturer(对方)关联的外键。 class:表示对方的类
  21. <many-to-many column="lecturer_id" class="com.ffy.studentmanage.Lecture"></many-to-many>
  22. </set>
  23. </class>
  24. </hibernate-mapping>

2.新建Leturer.hbm.xml(对方),填写映射关系

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
  3. <hibernate-mapping>
  4. <class name="com.ffy.studentmanage.Lecture" table="lecturer">
  5. <id name="id" column="id">
  6. <generator class="assigned"></generator>
  7. </id>
  8. <property name="uid" column="uid"></property>
  9. <property name="firstName" column="firstname"></property>
  10. <property name="lastName" column="lastname"></property>
  11. <property name="phone" column="phone"></property>
  12. <property name="collegeId" column="college_id"></property>
  13. //与上一步类似
  14. <set name="students" table="student_has_teacher">
  15. <key column="lecturer_id"></key>
  16. <many-to-many column="student_id" class="com.ffy.studentmanage.Student"></many-to-many>
  17. </set>
  18. </class>
  19. </hibernate-mapping>

3.在hibernate.cfg.xml中注册上面两个xml文件。

  1. <mapping resource="Student.hbm.xml"/>
  2. <mapping resource="Lecturer.hbm.xml"/>

二.annotation注解映射
1.在hibernate.cfg.xml中注册Student.class类和Lecturer.class类。

  1. <mapping class="com.ffy.studentmanage.Student"/>
  2. <mapping class="com.ffy.studentmanage.Lecture"/>

2.在Student.class类里面添加注解。

  1. package com.ffy.studentmanage;
  2. import java.util.Set;
  3. import javax.persistence.Column;
  4. import javax.persistence.Entity;
  5. import javax.persistence.Id;
  6. import javax.persistence.JoinColumn;
  7. import javax.persistence.JoinTable;
  8. import javax.persistence.ManyToMany;
  9. import javax.persistence.Table;
  10. @Entity
  11. @Table(name="student")
  12. public class Student {
  13. @Id
  14. @Column(name="id")
  15. private int id;
  16. @Column(name="sid")
  17. private int sid;
  18. @Column(name="firstname")
  19. private String firstName;
  20. @Column(name="lastname")
  21. private String lastName;
  22. @Column(name="gender")
  23. private String gender;
  24. @Column(name="phone")
  25. private String phone;
  26. @Column(name="email")
  27. private String email;
  28. @Column(name="date_of_birth")
  29. private String dateOfBirth;
  30. @Column(name="height")
  31. private double height
  32. //声明多对多关系
  33. @ManyToMany
  34. @JoinTable(name="student_has_teacher",
  35. joinColumns=@JoinColumn(name="student_id"),
  36. inverseJoinColumns=@JoinColumn(name="lecturer_id"))
  37. private Set<Lecture> lecturers;
  38. public int getId() {
  39. return id;
  40. }
  41. public void setId(int id) {
  42. this.id = id;
  43. }
  44. public int getSid() {
  45. return sid;
  46. }
  47. public void setSid(int sid) {
  48. this.sid = sid;
  49. }
  50. public String getFirstName() {
  51. return firstName;
  52. }
  53. public void setFirstName(String firstName) {
  54. this.firstName = firstName;
  55. }
  56. public String getLastname() {
  57. return lastName;
  58. }
  59. public void setLastname(String lastName) {
  60. this.lastName = lastName;
  61. }
  62. public String getGender() {
  63. return gender;
  64. }
  65. public void setGender(String gender) {
  66. this.gender = gender;
  67. }
  68. public String getPhone() {
  69. return phone;
  70. }
  71. public void setPhone(String phone) {
  72. this.phone = phone;
  73. }
  74. public String getEmail() {
  75. return email;
  76. }
  77. public void setEmail(String email) {
  78. this.email = email;
  79. }
  80. public String getDateOfBirth() {
  81. return dateOfBirth;
  82. }
  83. public void setDateOfBirth(String dateOfBirth) {
  84. this.dateOfBirth = dateOfBirth;
  85. }
  86. public double getHeight() {
  87. return height;
  88. }
  89. public void setHeight(double height) {
  90. this.height = height;
  91. }
  92. public String getLastName() {
  93. return lastName;
  94. }
  95. public void setLastName(String lastName) {
  96. this.lastName = lastName;
  97. }
  98. public Set<Lecture> getLecturers() {
  99. return lecturers;
  100. }
  101. public void setLecturers(Set<Lecture> lecturers) {
  102. this.lecturers = lecturers;
  103. }
  104. // public String toString(){
  105. // return this.id+":"+this.lastName+this.firstName+this.gender+":"+this.phone+":"+this.email+";username"+studentLogin.getUsername()+";password:"+studentLogin.getPassword();
  106. // }
  107. }

3.在Lecturer.class里面添加注解

  1. package com.ffy.studentmanage;
  2. import java.util.Set;
  3. import javax.persistence.Column;
  4. import javax.persistence.Entity;
  5. import javax.persistence.Id;
  6. import javax.persistence.ManyToMany;
  7. import javax.persistence.Table;
  8. @Entity
  9. @Table(name="lecturer")
  10. public class Lecture {
  11. @Id
  12. @Column(name="id")
  13. private int id;
  14. @Column(name="uid")
  15. private String uid;
  16. @Column(name="firstname")
  17. private String firstName;
  18. @Column(name="lastname")
  19. private String lastName;
  20. @Column(name="phone")
  21. private String phone;
  22. @Column(name="college_id")
  23. private int collegeId;
  24. //将权限交由对方,即Student.class。主控方与被控方通过主控方里的lecturers属性建立联系。
  25. @ManyToMany(mappedBy="lecturers")
  26. private Set<Student> students;
  27. public int getId() {
  28. return id;
  29. }
  30. public void setId(int id) {
  31. this.id = id;
  32. }
  33. public String getUid() {
  34. return uid;
  35. }
  36. public void setUid(String uid) {
  37. this.uid = uid;
  38. }
  39. public String getFirstName() {
  40. return firstName;
  41. }
  42. public void setFirstName(String firstName) {
  43. this.firstName = firstName;
  44. }
  45. public String getLastName() {
  46. return lastName;
  47. }
  48. public void setLastName(String lastName) {
  49. this.lastName = lastName;
  50. }
  51. public String getPhone() {
  52. return phone;
  53. }
  54. public void setPhone(String phone) {
  55. this.phone = phone;
  56. }
  57. public int getCollegeId() {
  58. return collegeId;
  59. }
  60. public void setCollegeId(int collegeId) {
  61. this.collegeId = collegeId;
  62. }
  63. public Set<Student> getStudents() {
  64. return students;
  65. }
  66. public void setStudents(Set<Student> students) {
  67. this.students = students;
  68. }
  69. }

发表评论

表情:
评论列表 (有 0 条评论,259人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Hibernate关系映射之一映射

    一、基本概述 在表中的一对多,是使用外键关联,通过一张表的一个键另一个表的外键来建立一多关系;而在类中表示为一个类中有一个集合属性包含对方类的很多对象,而在另一个类中,只包