一对多 单向
<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 stub28 }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 2 45 6 177 98 10 11 15 16
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 Think29 *30 */31 public class OneToManyTest extends HiberanteUtils{32 @Test33 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 // Setstudents = new HashSet ();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 @Test60 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 students = new HashSet ();72 //students.add(student);73 74 //classes.getStudents().add(student);//在hibernate内部查看的是classes.hbm.xml75 76 session.save(student);//在hibernate内部查看的是Student.hbm.xml77 transaction.commit();78 session.close();79 }80 81 @Test82 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 }