`

Hibernate之关联表

阅读更多
这个例子好像是IBM Dev上的Hibernate介绍,被人改编过了,我再改编一次,呵呵:P

重点是弄清Hibernate中两个表间一对一、一对多、多对多的关联,数据模式如图:
建表后插入些数据,如下:
select * from classes
+-----------+----------+
| ClassesId | name     |
+-----------+----------+
| 200201    | pro j2ee |
+-----------+----------+
select * from students
+------------+----------+-----------+
| StudentId  | name     | ClassesId |
+------------+----------+-----------+
| s_20020001 | andjia   | 200201    |
| s_20020002 | vincent  | 200201    |
| s_20020003 | mor      | 200201    |
+------------+----------+-----------+
select * from courses
+----------+---------------+
| CourseId | name          |
+----------+---------------+
| c_001    | computer-java |
| c_002    | computer-c++  |
+----------+---------------+
select * from address
+------------+------+--------+-------+--------+
| AddressId  | City | Street | State | Zip    |
+------------+------+--------+-------+--------+
| s_20020001 | as   | sd     | zse   | 123333 |
| s_20020002 | bj   | hd     | bj    | 123456 |
| s_20020003 | bb   | cc     | fdse  | 121333 |
+------------+------+--------+-------+--------+
select * from student_course_link
+----------+------------+
| CourseId | StudentId  |
+----------+------------+
| c_001    | s_20020001 |
| c_001    | s_20020002 |
| c_002    | s_20020002 |
| c_002    | s_20020003 |
+----------+------------+
student与address之间是1对1
student与classes之间是n对1
student与courses之间是n对n

OK,我们来看hbm.xml的写法,先看最关键的student.hbm.xml



<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
    "-//Hibernate/Hibernate Mapping DTD 2.0//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">

<hibernate-mapping>
    <class name="xxxxxxx.hibernate.Student"
        table="Students"
        dynamic-update="false"
    >
        <id name="id"
            column="StudentId"
            type="string"
            unsaved-value="any"
        >
            <generator class="assigned"/>
        </id>
        <property
            name="name"
            type="string"
            update="true"
            insert="true"
            column="Name"
        />
        <set name="courses"
            table="Student_Course_Link"
            lazy="false"
            inverse="false"
            cascade="all"
            sort="unsorted"
        >
              <key column="StudentId"/>
              <many-to-many class="xxxxxxx.hibernate.Course"
                  column="CourseId"
                  outer-join="auto"
              />
        </set>
        <many-to-one
            name="classes"
            class="xxxxxxx.hibernate.Classes"
            cascade="none"
            outer-join="auto"
            update="true"
            insert="true"
            column="ClassesId"
        />
         <one-to-one
            name="address"
            class="xxxxxxx.hibernate.Address"
            cascade="none"
            outer-join="auto"
            constrained="false"
        />      
    </class>
</hibernate-mapping>




后面many-to-one和one-to-one比较简单,主要是many-to-many这块,必须制定关联键,而且在Student的Bean里,要设一个Set,而不是一个对象,如下
public class Student
{
   /**属性,和students表中的字段对应**/
   private String id;
   private String name;
   /**和其它类之间的映射关系**/
   private Set courses;
   private Classes classes;
   private Address address;
而在其他3个类的映射文件中,Address和一般的Bean完全一样,Classes类有个Set的私有域,用来存放多个学生,同样指定关联键
        <set
            name="students"
            ……
        >
              <key column="ClassesId"/>
              <one-to-many class="xxxxxxs.hibernate.Student"/>
        </set>
Course类的映射文件中的many-to-many与Student中的一样,就相应的表名等等正好颠倒一下。

于是我们可以根据StudentID取得一个Student对象,其中包含了对应的Course等信息,如:
Student st=(Student)sess.load(Student.class,request.getParameter("studentId"));
Set courses=st.getCourses();
for(Iterator it=courses.iterator();it.hasNext();){    
    Course course=(Course)it.next();
    ……      
}

  • 大小: 9.4 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics