Hibernate学习笔记(四)

来源:互联网 发布:mac u盘刻录dmg 编辑:程序博客网 时间:2024/05/18 03:13

六、关联映射

我们已经映射了一个持久化实体类到表上。让我们在这个基础上增加一些类之间的关联。首先我们往应用程序里增加人(people)的概念,并存储他们所参与的一个 Event 列表。

最初简单的 Person 类:

package org.hibernate.tutorial.domain;
 
public class Person {
 
    private Long id;
    private int age;
    private String firstname;
    private String lastname;
 
    public Person() {}
 
    // Accessor methods for all properties, private setter for 'id'
 
}

然后,创建新的映射文件 Person.hbm.xml

 
<hibernate-mapping package="org.hibernate.tutorial.domain">
 
    <class name="Person" table="PERSON">
        <id name="id" column="PERSON_ID">
            <generator class="native"/>
        </id>
        <property name="age"/>
        <property name="firstname"/>
        <property name="lastname"/>
    </class>
 
</hibernate-mapping
> 

最后,把新的映射加入到 Hibernate 的配置中:

 
<mapping resource="events/Event.hbm.xml"/>
<mapping resource="events/Person.hbm.xml"/>

现在我们在这两个实体之间创建一个关联。显然,persons 可以参与一系列 events,而 events 也有不同的参加者(persons)。我们需要处理的设计问题是关联方向(directionality),阶数(multiplicity)和集合(collection)的行为。

单向 Set-based 的关联

我们将向 Person 类增加一连串的 events。那样,通过调用 aPerson.getEvents(),就可以轻松地导航到特定 person 所参与的 events,而不用去执行一个显式的查询。我们使用 Java 的集合类(collection):Set,因为 set 不包含重复的元素及与我们无关的排序。

public class Person {
 
    private Set events = new HashSet();
 
    public Set getEvents() {
        return events;
    }
 
    public void setEvents(Set events) {
        this.events = events;
    }
}

在映射这个关联之前,先考虑一下此关联的另外一端。很显然,我们可以保持这个关联是单向的。或者,我们可以在 Event里创建另外一个集合,如果希望能够双向地导航,如:anEvent.getParticipants()。从功能的角度来说,这并不是必须的。因为你总可以显式地执行一个查询,以获得某个特定 event 的所有参与者。这是个在设计时需要做出的选择,完全由你来决定,但此讨论中关于关联的阶数是清楚的:即两端都是值的,我们把它叫做多对多(many-to-many关联。因而,我们使用 Hibernate 的多对多映射:

 
<class name="Person" table="PERSON">
    <id name="id" column="PERSON_ID">
        <generator class="native"/>
    </id>
    <property name="age"/>
    <property name="firstname"/>
    <property name="lastname"/>
 
    <set name="events" table="PERSON_EVENT">
        <key column="PERSON_ID"/>
        <many-to-many column="EVENT_ID" class="Event"/>
    </set>
 
</class
> 

Hibernate 支持各种各样的集合映射,<set> 使用的最为普遍。对于多对多关联(或叫 n:m 实体关系), 需要一个关联表(association table)。