一对多 单向
<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 }
hibernate建表 一对多 多的一方控制一的一方,布布扣,bubuko.com
时间: 2024-10-12 07:17:42