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分钟学习)。

原文发布于微信公众号 - Java学习网(javalearns)

原文发表时间:2017-11-30

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏地方网络工作室的专栏

Python3 初学实践案例(5)可设定长度和密码复杂级别的生成密码脚本另一种思路

Python3 初学实践案例(5)可设定长度和密码复杂级别的生成密码脚本另一种思路 在上一篇博文当中,我们用 python 脚本实现了一个可设定长度和密码复杂级...

2029
来自专栏Golang语言社区

Golang语言--中间的derfer

defer Go语言中有种不错的设计,即延迟(defer)语句,你可以在函数中添加多个defer语句。当函数执行到最后时,这些defer语句会按照逆序执行, 最...

4138
来自专栏陈树义

JVM系列第4讲:从源代码到机器码,发生了什么?

在上篇文章我们聊到,无论什么语言写的代码,其到最后都是通过机器码运行的,无一例外。那么对于 Java 语言来说,其从源代码到机器码,这中间到底发生了什么呢?这就...

1312
来自专栏JavaQ

Java方向如何准备BAT技术面试答案(汇总版)

这个主题的内容之前分三个篇幅分享过,导致网络上传播的比较分散,所以本篇做了一个汇总,同时对部分内容及答案做了修改,欢迎朋友们吐槽、转发。因为篇幅长度和时间的原因...

4789
来自专栏落影的专栏

静态库与动态库的思考

前言 在上文《编译与链接过程的思考》评论中暴走大牙提到了静态库和动态库依赖的问题,还在群里提了几个测试样例和测试工程。 大致介绍下测试工程和如何进行测试: ...

3796
来自专栏JavaEE

Java面试题 - 01

其实对于大多数刚入门的初级程序员来说,写代码都还停留在复制粘贴修改阶段(我也一样),虽然可以复制粘贴的时候看上去很厉害了,其实都是假象。面试的时候可能面试官随便...

1503
来自专栏技术墨客

Hazelcast集群服务(4)——分布式Map

    在第一篇介绍Hazelcast的文章已经提到,Hazelcast为Java中绝大部分数据结构提供了分布式实现。我们常用的Map、List、Queue等数...

2613
来自专栏MasiMaro 的技术博文

VC++ 崩溃处理以及打印调用堆栈

一般当程序发生异常时,用户代码停止执行,并将CPU的控制权转交给操作系统,操作系统接到控制权后,将当前线程的环境保存到结构体CONTEXT中,然后查找针对此异常...

3654
来自专栏微信公众号:Java团长

Java网络爬虫基础知识

Java 网络爬虫具有很好的扩展性可伸缩性,其是目前搜索引擎开发的重要组成部分。例如,著名的网络爬虫工具 Nutch 便是采用 Java 开发,该工具以 Apa...

1442
来自专栏Java 源码分析

synchronized 原理分析

synchronized 原理分析 1. 在阅读源码时做了大量的注释,并且做了一些测试分析源码内的执行流程,由于博客篇幅有限,并且代码阅读起来没有 IDE 方...

2513

扫码关注云+社区

领取腾讯云代金券