关联关系映射,是映射关系中比较复杂的一种映射关系,总的说来有一对一、一对多和多对多几种关系。细分起来他们又有单向和双向之分。下面我们逐一介绍一下。
单向 OneToOne
单向一对一是关联关系映射中最简单的一种,简单地说就是可以从关联的一方去查询另一方,却不能反向查询。我们用下面的例子来举例说明,清单 1 中的 Person 实体类和清单 2 中的 Address 类就是这种单向的一对一关系,我们可以查询一个 Person 的对应的 Address 的内容,但是我们却不能由一个 Address 的值去查询这个值对应的 Person。
清单 1. 单向一对一关系的拥有端
@Entity public class Person implements Serializable { private static final long serialVersionUID = 1L; @Id @GeneratedValue(strategy = GenerationType.AUTO) private Long id; private String name; private int age; @OneToOne private Address address; // Getters & Setters }
清单 2. 单向一对一关系的反端
@Entity
public class Address implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private String street;
private String city;
private String country;
// Gettes& Setters
}
图 1. 单向一对一关系对应的 ER 图
从图 1 他们的 ER 图上可以看出,这种单向的一对一关系在数据库中是以外键的形式被映射的。其中关系的发出端存储一个指向关系的接收端的一个外键。在这个例子中 Person 表中的 ADDRESS_ID 就是指向 address 标的一个外键,缺省情况下这个外键的字段名称,是以它指向的表的名称加下划线“_”加“ID”组成的。当然我们也可以根据我们的喜好来修改这个字段,修改的办法就是使用 @JoinColumn 这个注解。在这个例子中我们可以将这个注解注释在 Person 类中的 Address 属性上去。
双向 OneToOne
双向关系有一方为关系的拥有端,另一方是关系的反端,也就是“Inverse”端。在这里例子中 Person 拥有这个关系,而 Address 就是关系的“Inverse”端。Address 中我们定义了一个 person 属性,在这个属性上我们使用了 @OneToOne 注解并且定义了他的“mappedBy”属性,这个在双向关系的“Inverse”端是必需的,在下面将要介绍的双向关系中也要用到这个属性。
清单 3. 双向一对一关系中的接受端
@Entity public class Address implements Serializable { private static final long serialVersionUID = 1L; @Id @GeneratedValue(strategy = GenerationType.AUTO) private Long id; private String street; private String city; private String country; @OneToOne(mappedBy = "address") private Person person; // Gettes& Setters }
单向 OneToMany
单向关系的一对多我们可以用清单 4 和清单 5 来说明。在关系的发出端 Person 中我们使用 OneToMany 这个注解对 cellPhones 这个属性进行了注释,cellPhones 中存储的是 CellPhone 的一个 List 对象,JPA 就是用这种方式实现一对多的。
清单 4. 单向一对多关系的发出端
public class Person implements Serializable { private static final long serialVersionUID = 1L; @Id @GeneratedValue(strategy = GenerationType.AUTO) private Long id; private String name; private int age; @OneToMany private List<CellPhone> cellPhones; // Getters and Setters }
清单 5. 单向一对多关系的接收端
@Entity
public class CellPhone implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private String manufacture;
private String color;
private Long phoneNo;
// Getters and Setters
}
图 2. 单向一对多关系对应的 ER 图
在一对多关联关系映射中,默认是以中间表的方式来映射这种关系的。如在本例中,中间表为 person_cellphone,表的名称为关系的拥有端和 Inverse 端中间用下划线连接。中间表的字两个字段分别为两张表的得表名加下划线“_”加 ID 组成。当然我们也可以改表这种默认的中间表的映射方式,我们可以在关系的拥有端使用 @JoinClolum 来使用外键的方式映射这个关系。
双向 OneToMany
清单 6. 双向一对多关系的接受端
@Entity public class Person implements Serializable { private static final long serialVersionUID = 1L; @Id @GeneratedValue(strategy = GenerationType.AUTO) private Long id; private String name; private int age; @OneToMany(mappedBy = "person") private List<CellPhone> cellPhones; // Getters and Setters }
清单 7. 双向一对多关系的发出端
@Entity
public class CellPhone implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private String manufacture;
private String color;
private Long phoneNo;
@ManyToOne
private Person person;
// Getters and Setters
}
图 3. 双向一对多关系对应的 ER 图
单向 ManyToMany
多对多关联关系中只能通过中间表的方式进行映射。本例的单向多对多关系如下所示。
在清单 8 中我们使用了 ManyToMany 这个注解来对 Teacher 中的 Students 进行注释,其中 Teacher 就是关系的发出端。而在 Student 中我们并没有作任何定义,这是单向多对多的所要求的。
清单 8. 单向多对多关系的发出端
@Entity public class Teacher implements Serializable { private static final long serialVersionUID = 1L; @Id @GeneratedValue(strategy = GenerationType.AUTO) private Long id; private String name; private Boolean gender; private int age; private int height; @ManyToMany private List<Student> students; // Getters and Setters }
清单 9. 单向多对多关系的反端
@Entity public class Student implements Serializable { private static final long serialVersionUID = 1L; @Id @GeneratedValue(strategy = GenerationType.AUTO) private Long id; private String name; private Boolean gender; private int age; private int height; //Getters and Setters }
图 4. Teacher 对应得数据库表
图 5. Students 对应得数据库表
图 6. 中间生成表
双向 ManyToMany
清单 10. 双向多对多关系的拥有端
@Entity public class Teacher implements Serializable { private static final long serialVersionUID = 1L; @Id @GeneratedValue(strategy = GenerationType.AUTO) private Long id; private String name; private Boolean gender; private int age; private int height; @ManyToMany private List<Student> students; // Getters and Setters }
清单 11. 双向多对多关系的反端
@Entity public class Student implements Serializable { private static final long serialVersionUID = 1L; @Id @GeneratedValue(strategy = GenerationType.AUTO) private Long id; private String name; private Boolean gender; private int age; private int height; @ManyToMany(mappedBy = "students") private List<Teacher> teachers; //Getters and Setters }
图 7. 双向多对多关系对应的 ER 图
相关推荐
感觉JPA关联映射实现感觉比Hibernate配置文件的关联映射几乎一样,只是引入了“零配置”这个概念。劣者自己在做一个东西的时候用到了关联映射,在此将它做一个总结。留给自己回顾用。
是一款持久层框架,中文名Java持久层API,是JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中。JPA的对象关系映射(ORM)模型是基于Hibernate。是一款面向对象的ORM框架,JPA不...
ORM是对象关系映射的缩写,它将Java世界中的对象与关系数据库世界中的记录相关联。 Hibernate是开源的。它在以下站点上发布。 Hibernate和JPA JPA(Java持久性API)作为处理关系数据库的框架存在于Java EE中。 ...
hibernate核心,一对多,多对多映射讲解,看了就完全搞明白了
第7章 高级实体关联映射 7.1 单值的实体关联 7.1.1 共享的主键关联 7.1.2 一对一的外键关联 7.1.3 用联结表映射 7.2 多值的实体关联 7.2.1 一对多关联 7.2.2 多对多关联 7.2.3 把...
它为 Java 开发人员提供了一种对象/关联映射工具来管理 Java 应用中的关系数据。它的出现主要是为了简化现有的持久化开发工作和整合 ORM 技术,结束现在 Hibernate,TopLink,JDO 等 ORM 框架各自为营的局面。 值得...
JPA2.0 加入了大量必须的 ORM 映射增强特性,包括:支持通过使用 @ElementCollection 标注来增强 collections, maps 和 lists( 这里不是指实体之间的关联关系 ) 集合,支持 map 的单向 one-to-many 关联 (JPA1.0...
关于Hibernate的基本知识,有关关联映射,二级缓存,一对多,多对一,HQL查询等等.
示例应用程序演示了如何将Hibernate用作Spring Data JPA的JPA提供程序。 当前演示了以下概念: 概念 描述 看 Spring Data JPA存储库 使用再次执行操作关系数据库 直接EntityManager访问 直接访问JPA ...
在特定的实体关联属性上使用 @Embeddable 和 @AttributeOverride 注解可以覆盖该属性对应的嵌入式对象的列映射。 @Entity public class Person implements Serializable { // Persistent component using defaults...
10.1.1 对象/关系数据库映射(ORM) 365 10.1.2 JPA的映射规则 367 10.1.3 JPA规范简介 368 10.2 实体入门 368 10.2.1 开发实体 369 10.2.2 在Java SE环境下使用 Hibernate JPA实现 370 10.2.3 在Java SE环境下使用 ...
* 9.increnment 插入数据的时候hibernate会给主键添加一个自增的主键,但是一个hibernate实例就维护一个计数器,所以在多个实例运行的时候不能使用这个方法。 * 例:@GeneratedValue(generator = ...
全面包含Hibernate相关技术,老司机手把手带你一起飞,让你少走弯路。 包含Hibernate相关技术: ...组件映射、继承映射、缓存、JPA 反向工程、封装GenericDao 教学全程采用笔记+代码案例的形式讲解,通俗易懂!!!
我用来运行 JPA/Hibernate 研讨会的点点滴滴。 代码使用 maven 和 Spring 来运行示例映射 锡罐中包含什么? 没什么太狂野的 一对一 一对多/多对一 多对多 嵌入式 辅助表 遗产 懒惰抓取 查询 JPQL 命名查询 Spring...
一对多双向关系映射带有Spring Boot的Java Web Services和RESTful API 本教程将引导您完成使用Spring Boot,Spring Data JPA,Lombok,H2和Swagger映射JPA / Hibernate一对多双向关系的步骤。 下表关系图说明了此...
类与类之间的关系主要体现在表与表之间的关系进行操作,它们都市对对象进行操作,我们程序中把所有的表与类都映射在一起,它们通过配置文件中的many-to-one、one-to-many、many-to-many、 4. 说下Hibernate的缓存...
本课程讲述Java ORM框架Hibernate,内容包括:环境配置、Hibernate架构、SessionFactory、Session、映射文件、基于注解的配置、JPA、HQL查询、Criteria查询、关联映射、缓存、正逆向工程。
使用MySQL和Spring详细描述Hibernate有多对多关联
Java正则表达式 批量上传--采集 (多个文件夹) The Agile Way hibernate mapping文件中的标记详解:关系标记 ANT 安装使用及build.xml文档模板 inverse和cascade在关联更新中的作用 hibernate ...
第9章 集成Spring和Hibernate/JPA 196 9.1 为什么在Struts 2中使用Spring 196 9.1.1 依赖注入能做些什么 197 9.1.2 Spring如何管理对象和注入依赖 199 9.1.3 使用接口隐藏实现 200 9.2 将Spring添加到Struts 2 202 ...