hibernate 2 多對多映射
阿新 • • 發佈:2018-02-04
開發環境 username ron 標準 pro ets 啟動 private net
一、實體類
1、Classes.java
1 package cn.gs.wwg.entity; 2 3 import java.util.Set; 4 5 public class Classes { 6 private int cid; 7 private String cname; 8 private String cdescription; 9 private Set<Student> students; 10 public int getCid() { 11 return cid; 12 }13 public void setCid(int cid) { 14 this.cid = cid; 15 } 16 public String getCname() { 17 return cname; 18 } 19 public void setCname(String cname) { 20 this.cname = cname; 21 } 22 public String getCdescription() { 23 return cdescription; 24 }25 public void setCdescription(String cdescription) { 26 this.cdescription = cdescription; 27 } 28 public Set<Student> getStudents() { 29 return students; 30 } 31 public void setStudents(Set<Student> students) { 32 this.students = students; 33 }34 35 }
2、Student.java
1 package cn.gs.wwg.entity; 2 3 import java.io.Serializable; 4 import java.util.Set; 5 6 public class Student implements Serializable{ 7 private int sid; 8 private String sname; 9 private String sdescription; 10 private Set<Classes> classes; 11 12 13 public Set<Classes> getClasses() { 14 return classes; 15 } 16 public void setClasses(Set<Classes> classes) { 17 this.classes = classes; 18 } 19 public int getSid() { 20 return sid; 21 } 22 public void setSid(int sid) { 23 this.sid = sid; 24 } 25 public String getSname() { 26 return sname; 27 } 28 public void setSname(String sname) { 29 this.sname = sname; 30 } 31 public String getSdescription() { 32 return sdescription; 33 } 34 public void setSdescription(String sdescription) { 35 this.sdescription = sdescription; 36 } 37 38 }
二:配置映射信息,建立表與類之間關系
1、Classes.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://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 5 <hibernate-mapping> 6 <!-- 7 class 用來描述一個持久化類 8 name:持久化類全名 9 table: 表名 可以不寫 默認和實體類名一致 10 --> 11 <class name="cn.gs.wwg.entity.Classes" > 12 <!-- 13 標示屬性 和數據庫中主鍵對應 14 --> 15 <id name="cid" column="cid" type="java.lang.Integer"> 16 <!-- 主鍵產生器 --> 17 <generator class="assigned"> 18 19 </generator> 20 </id> 21 <property name="cname" column="cname" type="java.lang.String"></property> 22 <property name="cdescription" column="cdescription" type="java.lang.String"></property> 23 <!-- 24 cascade="save-update" 25 當保存班級的時候對學生進行什麽樣的操作 26 --> 27 <set name="students" table="student_classes" cascade="all"> 28 <!-- key用來描述外鍵 29 set元素對應了classes類中的集合 30 通過key是通過外鍵的形式將兩張表建立聯系 31 通過one-to-many讓兩個類建立關聯 32 --> 33 <key> 34 <column name="cid"></column> 35 </key> 36 <many-to-many class="cn.gs.wwg.entity.Student" column="sid"></many-to-many> 37 </set> 38 </class> 39 </hibernate-mapping>
2、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://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 5 <hibernate-mapping> 6 <!-- 7 class 用來描述一個持久化類 8 name:持久化類全名 9 table: 表名 可以不寫 默認和實體類名一致 10 --> 11 <class name="cn.gs.wwg.entity.Student" > 12 <!-- 13 標示屬性 和數據庫中主鍵對應 14 --> 15 <id name="sid" column="sid" type="java.lang.Integer"> 16 <!-- 主鍵產生器 --> 17 <generator class="assigned"> 18 19 </generator> 20 </id> 21 <property name="sname" column="sname" type="java.lang.String"></property> 22 <property name="sdescription" column="sdescription" type="java.lang.String"></property> 23 <!-- 24 多對一 column 描述外鍵 25 --> 26 <set name="classes" table="student_classes" cascade="all"> 27 <!-- key用來描述外鍵 28 set元素對應了classes類中的集合 29 通過key是通過外鍵的形式將兩張表建立聯系 30 通過one-to-many讓兩個類建立關聯 31 --> 32 <key> 33 <column name="sid"></column> 34 </key> 35 <many-to-many class="cn.gs.wwg.entity.Classes" column="cid"></many-to-many> 36 </set> 37 </class> 38 </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://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> 5 6 <hibernate-configuration> 7 <!-- 一個session-factory只能鏈接一個數據庫 --> 8 <session-factory> 9 <!-- 10 進行數據庫連接 11 driver:驅動 12 url:地址 13 username:數據庫連接用戶名 14 password:數據庫連接密碼 15 數據庫方言 16 不同的數據庫中,sql語法略有區別. 指定方言可以讓hibernate框架在生成sql語句時.針對數據庫的方言生成. 17 sql99標準: DDL 定義語言 庫表的增刪改查 18 DCL 控制語言 事務 權限 19 DML 操縱語言 增刪改查 20 註意: MYSQL在選擇方言時,請選擇最短的方言. 21 --> 22 <property name="dialect">org.hibernate.dialect.Oracle10gDialect</property> 23 <property name="connection.driver_class">oracle.jdbc.driver.OracleDriver</property> 24 <property name="connection.url">jdbc:oracle:thin:@localhost:1521:orcl</property> 25 <property name="connection.username">liuyang</property> 26 <property name="connection.password">orcl</property> 27 <!-- 28 自動建表 29 auto schema export 自動導出表結構. 自動建表 30 hibernate.hbm2ddl.auto create 自動建表.每次框架運行都會創建新的表.以前表將會被覆蓋,表數據會丟失.(開發環境中測試使用) 31 hibernate.hbm2ddl.auto create-drop 自動建表.每次框架運行結束都會將所有表刪除.(開發環境中測試使用) 32 hibernate.hbm2ddl.auto update(推薦使用) 自動生成表.如果已經存在不會再生成.如果表有變動.自動更新表(不會刪除任何數據). 33 hibernate.hbm2ddl.auto validate 校驗.不自動生成表.每次啟動會校驗數據庫中表是否正確.校驗失敗. 34 --> 35 <!-- <property name="hbm2ddl.auto">update</property> --> 36 <property name="hbm2ddl.auto">update</property> 37 38 <!-- 將hibernate生成的sql語句打印到控制臺 --> 39 <property name="show_sql">true</property> 40 <!-- 添加映射文件 --> 41 <!-- <mapping resource="cn/gs/ly/entity/Person.hbm.xml"></mapping> --> 42 <!-- <mapping resource="cn/gs/ly/school/entity/Student.hbm.xml"></mapping> --> 43 <!-- <mapping resource="cn/gs/ly/school/entity/Classes.hbm.xml"></mapping> --> 44 <mapping resource="cn/gs/wwg/entity/Classes.hbm.xml"></mapping> 45 <mapping resource="cn/gs/wwg/entity/Student.hbm.xml"></mapping> 46 </session-factory> 47 </hibernate-configuration>
四、測試類
ManyToManyTest.java
1 package cn.gs.wwg.entity.test; 2 3 import java.util.HashSet; 4 import java.util.List; 5 import java.util.Set; 6 7 import org.hibernate.Session; 8 import org.hibernate.SessionFactory; 9 import org.hibernate.Transaction; 10 import org.hibernate.cfg.Configuration; 11 import org.junit.After; 12 import org.junit.Before; 13 import org.junit.Test; 14 15 import cn.gs.wwg.entity.Classes; 16 import cn.gs.wwg.entity.Student; 17 18 public class ManyToManyTest { 19 20 SessionFactory factory =null; 21 Session se = null; 22 Transaction tr = null; 23 24 @Before 25 public void beforeStart(){ 26 Configuration con = new Configuration(); 27 con.configure(); 28 factory = con.buildSessionFactory(); 29 se = factory.openSession(); 30 tr = se.beginTransaction(); 31 } 32 @After 33 public void afterClose(){ 34 tr.commit(); 35 se.close(); 36 } 37 38 //3.新建一個班級的同時新建一個學生 39 @Test 40 public void testSaveStudent_Cascade_classes_Save(){ 41 42 Student student = new Student(); 43 student.setSid(1); 44 student.setSname("小明"); 45 student.setSdescription("調皮搗蛋"); 46 47 Classes classes = new Classes(); 48 classes.setCid(1); 49 classes.setCname("gs01"); 50 classes.setCdescription("有上升空間"); 51 52 // Set<Classes> cla = new HashSet<Classes>(); 53 // cla.add(classes); 54 // student.setClasses(cla); 55 Set<Student> stu = new HashSet<Student>();//實例化一個Set集合存放學生 56 stu.add(student); //把學生添加到集合中 57 classes.setStudents(stu); 58 se.save(classes); 59 60 } 61 62 // 4.已經存在一個班級,新建一個學生 建立聯系 inverse (班級) 63 @Test 64 public void testUpdateclasses_Cascade_Student_Save_R(){ 65 Classes classes = (Classes)se.get(Classes.class, 1); 66 Student student = new Student(); 67 student.setSid(2); 68 student.setSname("萌萌"); 69 student.setSdescription("萌男人"); 70 classes.getStudents().add(student); 71 //se.save(student); 72 73 } 74 75 // 4.已經存在一個班級,新建一個學生 建立聯系 inverse (學生) 76 @Test 77 public void testSaveStudent_R(){ 78 Classes classes = (Classes)se.get(Classes.class, 1); 79 Student student = new Student(); 80 student.setSid(3); 81 student.setSname("神秘人"); 82 student.setSdescription("未知"); 83 Set<Classes> cla = new HashSet<Classes>(); 84 cla.add(classes); 85 student.setClasses(cla); 86 se.save(student); 87 88 } 89 90 //5.已經存在一個學生,新建一個班級 91 @Test 92 public void testSaveStudent_CreateClass(){ 93 Student student = (Student)se.get(Student.class, 4); 94 Classes classes = new Classes(); 95 classes.setCid(2); 96 classes.setCname("gs02"); 97 classes.setCdescription("一群學霸"); 98 student.getClasses().add(classes); 99 } 100 101 //6.把一個學生從一個班級轉到另一個班級。 102 @Test 103 public void testTransform(){ 104 Student student = (Student) se.get(Student.class, 1);//學生1從1班轉到2班 105 Classes classes1 = (Classes)se.get(Classes.class, 1); 106 Classes classes2 = (Classes)se.get(Classes.class, 2); 107 student.getClasses().remove(classes1); 108 student.getClasses().add(classes2); 109 } 110 111 //8.解除一個班級和一些學生的關系 112 @Test 113 public void test_Some(){ 114 Student student = (Student)se.get(Student.class, 1); 115 Student student2 = (Student)se.get(Student.class, 2); 116 student.setClasses(null); 117 student2.setClasses(null); 118 } 119 120 //11.已經存在了一個班級,也存在許多學生 建立班級與學生的關系。方法一 121 @Test 122 public void testR_Some(){ 123 Classes classes = (Classes)se.get(Classes.class,1); 124 Student student = (Student)se.get(Student.class, 1); 125 Student student2 = (Student)se.get(Student.class, 2); 126 student.getClasses().add(classes); 127 student2.getClasses().add(classes); 128 // classes.getStudents().add(student2);Ч??? 129 // classes.getStudents().add(student); 130 } 131 132 //11.已經存在了一個班級,也存在許多學生 建立班級與學生的關系。方法二 133 @Test 134 public void testR_Some_2(){ 135 Classes classes = (Classes)se.get(Classes.class,1); 136 List<Student> studentList = se.createQuery("from Student where sid in(1,2)").list(); 137 classes.getStudents().addAll(studentList); 138 } 139 140 //12.已經存在了一些班級,也存在許多學生 建立班級與學生的關系。(每名學生都有多個班級) 141 @Test 142 public void testR_Some_3(){ 143 List<Student> studentList = se.createQuery("from Student where sid in(3,4)").list(); 144 List<Classes> classesList = se.createQuery("from Classes where cid in(1,2)").list(); 145 for(Student s:studentList){ 146 s.getClasses().addAll(classesList); //學生3、4都關聯兩個班級1、2 147 } 148 } 149 150 //13.刪除班級 151 @Test 152 public void testR_Some_5(){ 153 Classes classes = (Classes)se.get(Classes.class, 2); 154 //classes.setStudents(null); //解除關系 inverse="true"時需此操作 155 se.delete(classes); 156 } 157 }
hibernate 2 多對多映射