随笔-61  评论-159  文章-0  trackbacks-0

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

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

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

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

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

例子:
        1、Classes的POJO类
1public class Classes {
2    private int id;
3    private String name;
4    private Set students;
5//省略setter、getter方法
6}
       2、Student的POJO类
1public 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、测试方法:
 1import java.util.HashSet;
 2import java.util.Set;
 3import junit.framework.TestCase;
 4import org.hibernate.Session;
 5
 6public 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:本博客文章,如果没有注明是有“转”字样,属于本人原创。如果需要转载,务必注明作者文章的详细出处地址,否则不允许转载,多谢合作!
posted on 2008-10-11 13:37 apple0668 阅读(630) 评论(0)  编辑  收藏 所属分类: hibernate

只有注册用户登录后才能发表评论。


网站导航: