系统学习hibernate之七:一对多单向关联

系统学习hibernate之七:一对多单向关联

hihernate一对多关联映射(单向Classes----->Student)

一对多关联映射利用了多对一关联映射原理

多对一关联映射:在多的一端加入一个外键指向一的一端,它维护的关系是多指向一
一对多关联映射:在多的一端加入一个外键指向一的一端,它维护的关系是一指向多

也就是说一对多和多对一的映射策略是一样的,只是站的角度不同

在一一端维护关系的缺点:
 * 如果将t_student表里的classesid字段设置为非空,则无法保存
 * 因为不是在student这一端维护关系,所以student不知道是哪个班的,
   所以需要发出多余的update语句来更新关系

例子:
        1、Classes的POJO类
1 public   class  Classes  {
2    private int id;
3    private String name;
4    private Set students;
5//省略setter、getter方法
6}
       2、Student的POJO类
1 public   class  Student  {
2    private int id;
3    private String name;
4//省略setter、getter方法
5}
3、Classes中的映射文件Classes.hbm.xml
 1 <? xml version="1.0" ?>
 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  package ="org.apple.hibernate" >
 6      < class  name ="Classes"  table ="t_classes"   >
 7          < id  name ="id" >
 8              < generator  class ="native" />
 9          </ id >
10          < property  name ="name" />
11          < set  name ="students" >
12              < key  column ="classesid" />
13              < one-to-many  class ="Student" />
14          </ set >
15      </ class >
16 </ hibernate-mapping >

4、Student中的映射文件Student.hbm.xml
 1 <? xml version="1.0" ?>
 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      < class  name ="org.apple.hibernate.Student"  table ="t_student" >
 7          < id  name ="id" >
 8              < generator  class ="native" />
 9          </ id >
10          < property  name ="name" />
11      </ class >
12 </ hibernate-mapping >

5、测试方法:
 1 import  java.util.HashSet;
 2 import  java.util.Set;
 3 import  junit.framework.TestCase;
 4 import  org.hibernate.Session;
 5
 6 public   class  One2Many1  extends  TestCase  {
 7    public void testSave(){
 8        Session session = null;
 9        try {
10            session = HibernateUtil.getSession();
11            session.beginTransaction();
12            Student student = new Student();
13            student.setName("张三");
14            Student student1= new Student();
15            student1.setName("李四");
16            session.save(student);
17            session.save(student1);
18            Set students = new HashSet();
19            students.add(student);
20            students.add(student1);
21            Classes classes = new Classes();
22            classes.setName("计算机04-3");
23            classes.setStudents(students);
24            session.save(classes);
25            session.beginTransaction().commit();
26            
27        }
 catch (Exception e) {
28            e.printStackTrace();
29            session.beginTransaction().rollback();
30        }
finally
31        {
32            session.close();
33        }

34    }

35
36}

37

6、控制台输出sql语句
Hibernate: insert into t_student (name) values (?)
Hibernate: insert into t_student (name) values (?)
Hibernate: insert into t_classes (name) values (?)
Hibernate: update t_student set classesid=? where id=?
Hibernate: update t_student set classesid=? where id=?

PS:后面两条update语句是由于t_student表里面的classesid数据更新导致。

-------------------------------------------------------------------------------------------------
PS:本博客文章,如果没有注明是有“转”字样,属于本人原创。如果需要转载,务必注明作者文章的详细出处地址,否则不允许转载,多谢合作!

你可能感兴趣的:(系统学习hibernate之七:一对多单向关联)