hibernate建表 一对多 多的一方控制一的一方
一对多 单向
<one-to-many>
通过calss操作student
外键在student表中,所以外键由student维护
<many-to-one>
通过student操作class
外键在student中,所以自动维护student的外键 没有inverse属性
建议用多对一这个方向的操作效率比较高
Student.java
1 package cn.itcast.hiberate.sh.domain; 2 3 public class Student { 4 private Long sid; 5 private String sname; 6 private String description; 7 Classes classes; 8 9 public Classes getClasses() { 10 return classes; 11 } 12 public void setClasses(Classes classes) { 13 this.classes = classes; 14 } 15 public Long getSid() { 16 return sid; 17 } 18 public void setSid(Long sid) { 19 this.sid = sid; 20 } 21 public Student(String sname, String description) { 22 super(); 23 this.sname = sname; 24 this.description = description; 25 } 26 public Student() { 27 // TODO Auto-generated constructor stub 28 } 29 public String getSname() { 30 return sname; 31 } 32 public void setSname(String sname) { 33 this.sname = sname; 34 } 35 public String getDescription() { 36 return description; 37 } 38 public void setDescription(String description) { 39 this.description = description; 40 } 41 42 }
Student.hbm.xml
1 <?xml version="1.0" encoding="utf-8"?> 2 <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 3 "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 4 <hibernate-mapping> 5 <class name="cn.itcast.hiberate.sh.domain.Student"> 6 <id name="sid" length="5"> 7 <generator class="increment"></generator> 8 </id> 9 <property name="sname" length="20"></property> 10 <property name="description" length="100"></property> 11 <!-- 12 多对一 13 column 外键 14 --> 15 <many-to-one name="classes" class="cn.itcast.hiberate.sh.domain.Classes" column="cid" cascade="save-update"></many-to-one> 16 </class> 17 </hibernate-mapping>
test.java语句
1 package cn.itcast.hibernate.sh.test; 2 3 import java.util.HashSet; 4 import java.util.Set; 5 6 import org.hibernate.Session; 7 import org.hibernate.Transaction; 8 import org.junit.Test; 9 10 import cn.itcast.hiberate.sh.domain.Classes; 11 import cn.itcast.hiberate.sh.domain.Student; 12 import cn.itcast.hibernate.sh.utils.HiberanteUtils; 13 14 /** 15 * 3、新建一个班级的时候同时新建一个学生 16 * 4、已经存在一个班级,新建一个学生,建立学生与班级之间的关系 17 * 5、已经存在一个学生,新建一个班级,把学生加入到该班级 18 * 6、把一个学生从一个班级转移到另一个班级 19 * 7、解析一个班级和一个学生之间的关系 20 * 8、解除一个班级和一些学生之间的关系 21 * 9、解除该班级和所有的学生之间的关系 22 * 10、已经存在一个班级,已经存在一个学生,建立该班级与该学生之间的关系 23 * 11、已经存在一个班级,已经存在多个学生,建立多个学生与班级之间的关系 24 * 12、删除学生 25 * 13、删除班级 26 * 删除班级的时候同时删除学生 27 * 在删除班级之前,解除班级和学生之间的关系 28 * @author Think 29 * 30 */ 31 public class OneToManyTest extends HiberanteUtils{ 32 @Test 33 public void testSaveStudent_Cascade_Classes_Save(){ 34 Session session = sessionFactory.openSession(); 35 Transaction transaction = session.beginTransaction(); 36 Student student = new Student(); 37 student.setSname("班秘"); 38 student.setDescription("很神秘的一个工作"); 39 40 Classes classes = new Classes(); 41 classes.setCname("老毕亲子班"); 42 classes.setDescription("都是老毕的亲戚"); 43 44 student.setClasses(classes); 45 // Set<Student> students = new HashSet<Student>(); 46 // students.add(student); 47 // 48 // classes.setStudents(students); 49 session.save(student); 50 51 transaction.commit(); 52 session.close(); 53 } 54 55 56 /** 57 * 一对多,从多的一端维护关系效率比较高 58 */ 59 @Test 60 public void testSaveStudent_R(){ 61 Session session = sessionFactory.openSession(); 62 Transaction transaction = session.beginTransaction(); 63 64 Student student = new Student(); 65 student.setSname("这个人"); 66 student.setDescription("很好"); 67 68 Classes classes = (Classes)session.get(Classes.class, 2L); 69 student.setClasses(classes); 70 71 //Set<Student> students = new HashSet<Student>(); 72 //students.add(student); 73 74 //classes.getStudents().add(student);//在hibernate内部查看的是classes.hbm.xml 75 76 session.save(student);//在hibernate内部查看的是Student.hbm.xml 77 transaction.commit(); 78 session.close(); 79 } 80 81 @Test 82 public void testRelese_R(){ 83 Session session = sessionFactory.openSession(); 84 Transaction transaction = session.beginTransaction(); 85 Classes classes = (Classes)session.get(Classes.class, 2L); 86 Student student7 = (Student)session.get(Student.class, 7L); 87 Student student8 = (Student)session.get(Student.class, 8L); 88 student7.setClasses(null); 89 student8.setClasses(null); //也可以用以下替代
Classes classes=(Classes) session.get(Classes.class, 9L); Set<Student> stu=classes.getStudents(); for(Student s:stu) s.setClasses(null);
90 transaction.commit(); 91 session.close(); 92 } 93 }
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。