Teacher.java
1 package com.xiaostudy.domain; 2 3 import java.util.HashSet; 4 import java.util.Set; 5 6 /** 7 * Teacher 8 * 9 * @author xiaostudy 10 * 11 */ 12 public class Teacher { 13 // id 14 private Integer id; 15 // 普通屬性 16 private String name; 17 // 另一個類的集合 18 private Set<Student> students = new HashSet<Student>(); 19 20 // 自動生成get、set方法 21 public Integer getId() { 22 return id; 23 } 24 25 public void setId(Integer id) { 26 this.id = id; 27 } 28 29 public String getName() { 30 return name; 31 } 32 33 public void setName(String name) { 34 this.name = name; 35 } 36 37 public Set<Student> getStudents() { 38 return students; 39 } 40 41 public void setStudents(Set<Student> students) { 42 this.students = students; 43 } 44 45 }
Student.java
1 package com.xiaostudy.domain; 2 3 import java.util.HashSet; 4 import java.util.Set; 5 6 /** 7 * Student 8 * 9 * @author xiaostudy 10 * 11 */ 12 public class Student { 13 // id 14 private Integer id; 15 // 普通屬性 16 private String name; 17 // 另一個類的集合 18 private Set<Teacher> teachers = new HashSet<Teacher>(); 19 20 // 自動生成get、set方法 21 public Integer getId() { 22 return id; 23 } 24 25 public void setId(int id) { 26 this.id = id; 27 } 28 29 public String getName() { 30 return name; 31 } 32 33 public void setName(String name) { 34 this.name = name; 35 } 36 37 public Set<Teacher> getTeachers() { 38 return teachers; 39 } 40 41 public void setTeachers(Set<Teacher> teachers) { 42 this.teachers = teachers; 43 } 44 45 public void setId(Integer id) { 46 this.id = id; 47 } 48 49 }
Teacher.hbm.xml
1 <?xml version="1.0" encoding="UTF-8"?> 2 <!DOCTYPE hibernate-mapping PUBLIC 3 "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 4 "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> 5 <!-- 導入包 --> 6 <hibernate-mapping package="com.xiaostudy.domain"> 7 <!-- name為bean的類名,table為數據庫的表名 --> 8 <class name="Teacher" table="t_teacher"> 9 <!-- name為bean的id,column為數據庫表的列名 --> 10 <id name="id" column="id"> 11 <!-- 設置自動更新表,表沒有的話創建一個,有的話,再判斷結構是否為所需,如有沒有想應得列,會自動添加列,多余的也不會刪除 --> 12 <generator class="native"></generator> 13 </id> 14 <!-- name為普通屬性,column為數據庫表的列名,type為數據類型 --> 15 <property name="name" column="name" type="string"></property> 16 <!-- name為bean中另一個類的集合名稱,table為多對多中間的表,cascade為級聯設置自動更新表 --> 17 <set name="students" table="t_teacher_student" cascade="save-update"> 18 <!-- 自身連接外面的外鍵 --> 19 <key column="tid"></key> 20 <!-- column為另一個連接的外鍵,class為另一個bean的類名 --> 21 <many-to-many column="sid" class="Student"></many-to-many> 22 </set> 23 </class> 24 </hibernate-mapping>
Student.hbm.xml
1 <?xml version="1.0" encoding="UTF-8"?> 2 <!DOCTYPE hibernate-mapping PUBLIC 3 "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 4 "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> 5 <hibernate-mapping package="com.xiaostudy.domain"> 6 <class name="Student" table="t_student"> 7 <id name="id" column="id"> 8 <generator class="native"></generator> 9 </id> 10 <property name="name" column="name" type="string"></property> 11 <set name="teachers" table="t_teacher_student"> 12 <key column="sid"></key> 13 <many-to-many column="tid" class="Teacher"></many-to-many> 14 </set> 15 </class> 16 </hibernate-mapping>
hibernate.cfg.xml
1 <?xml version="1.0" encoding="UTF-8" ?> 2 <!DOCTYPE hibernate-configuration PUBLIC 3 "-//Hibernate/Hibernate Configuration DTD 3.0//EN" 4 "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> 5 6 <hibernate-configuration> 7 <session-factory> 8 <!-- 注冊驅動 --> 9 <property name="connection.driver_class">com.mysql.jdbc.Driver</property> 10 <!-- mysql的用戶名 --> 11 <property name="connection.username">root</property> 12 <!-- mysql的用戶密碼 --> 13 <property name="connection.password">123456</property> 14 <!-- 連接mysql的某庫 --> 15 <property name="connection.url">jdbc:mysql://localhost:3306/user</property> 16 <!-- 控制台輸出sql --> 17 <property name="show_sql">true</property> 18 <!-- 格式化輸出的sql --> 19 <property name="format_sql">true</property> 20 <!-- 自動提交事務 --> 21 <!-- <property name="connection.autocommit">true</property> --> 22 <!-- 創建sql表 23 update:如果沒有表,則創建一個。如果有表,而且表結構一致,那么不改變表。如果表結構不一樣,會添加sql表缺少的列,多余的也不會刪除。 24 create:不管sql表有沒有存在,都會重新創建表。 25 create-drop:在create的基礎上,每次關閉虛擬機時都會把表刪除了。 26 validate:效驗sql表,如果一致,則沒有反應,如果不一致了,會拋出異常。 27 --> 28 <property name="hbm2ddl.auto">update</property> 29 <!-- 將Session與線程綁定=> 只有配置了該配置,才能使用getCurrentSession --> 30 <property name="current_session_context_class">thread</property> 31 <!-- 數據庫方言配置 --> 32 <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property> 33 <!-- 導入映射文件 --> 34 <mapping resource="com/xiaostudy/domain/Teacher.hbm.xml"/> 35 <mapping resource="com/xiaostudy/domain/Student.hbm.xml"/> 36 </session-factory> 37 </hibernate-configuration>
Test1.java
1 package com.xiaostudy.test; 2 3 import org.hibernate.classic.Session; 4 5 import com.xiaostudy.domain.Student; 6 import com.xiaostudy.domain.Teacher; 7 import com.xiaostudy.util.HibernateUtils; 8 9 /** 10 * 測試多對多 11 * 12 * @author xiaostudy 13 * 14 */ 15 public class Test1 { 16 17 public static void main(String[] args) { 18 //根據hibernate工具類,獲取一個全新的Session 19 Session session = HibernateUtils.openSession(); 20 //開始事務 21 session.beginTransaction(); 22 Teacher teacher1 = new Teacher(); 23 Teacher teacher2 = new Teacher(); 24 teacher1.setName("t1"); 25 teacher2.setName("t2"); 26 27 Student student1 = new Student(); 28 Student student2 = new Student(); 29 student1.setName("s1"); 30 student2.setName("s2"); 31 32 //維護關系 33 teacher1.getStudents().add(student1); 34 teacher1.getStudents().add(student2); 35 teacher2.getStudents().add(student1); 36 teacher2.getStudents().add(student2); 37 38 //持久化數據 39 session.save(teacher1); 40 session.save(teacher2); 41 42 //關閉事務並提交事務 43 session.getTransaction().commit(); 44 //關閉資源 45 session.close(); 46 } 47 48 }
碼雲:https://gitee.com/xiaostudy2/hibernate_manyToMany_demo/attach_files