Java中使用Hibernate系列之单向Set-based的关联学习(第四节)

时间:2022-04-29
本文章向大家介绍Java中使用Hibernate系列之单向Set-based的关联学习(第四节),主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

接着学习,后续5个章节中我们将学习Hibernate关联映射的相关知识,前面我们已经映射了一个持久化实体类到表上,现在在这个基础上增加一些类之间的关联,首先我们往应用程序里增加人(people)的概念,并存储他们所参与的一个Event列表。

网络配图

先创建一个Person类(后面章节中也会用到此类),代码如下:

package events;
public class Person {
private Long id;
private int age;
private String firstname;
private String lastname;
public Person() {}
}

创建一个名为Person.hbm.xml的新映射文件(一定要加DTD引用):

<hibernate-mapping>
<class name="events.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"/>

现在我们在这两个实体之间创建一个关联。

从易到难,我们先学习单向Set-based的关联 ,在Person类增加一连串的events,通过调用aPerson.getEvents(),就可以轻松地链接到特定person所参与的events,而不用去执行一个显式的查询,我们使用Java的集合类(collection):Set,因为set 不包含重复的元素及与我们无关的排序。

我们用set实现一个单向多值关联,在Java类里为这个关联编码,接着映射它,代码如下:

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

在映射这个关联之前,先考虑一下此关联的另外一端,这个关联是单向的;我们也可以在Event里创建另外一个集合,我

们可以实现一个多对多(many-to-many)关联,这里我们用天Hibernate的多对多映射:

<class name="events.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="events.Event"/>
</set>
</class>

Hibernate支持各种各样的集合映射,<set>使用的最为普遍,对于多对多关联(或叫n:m实体关系), 需要一个关联表(association table),表里面的每一行代表从person到event的一个关联,表名是由set元素的table属性配置的,关联里面的标识符字段名,对于person的一端,是由<key>元素定义,而event一端的字段名是由<many-to-many>元素的column属性定义。你也必须告诉Hibernate集合中对象的类。

因而这个映射的数据库schema是:

映射关系图

好了,这一节的学习先到这里,后面章节中会继续学习Hibernate。我们学习方式是每一节学习一个知识点(每天花10分钟学习)。