有 3 种方法可以使用 @OneToMany 和 @ManyToOne来映射 JPA 和 Hibernate 中的一对多和多对一关系,包括
- 使用@OneToMany和@ManyToOne进行双向映射
- 带@ManyToOne的单向映射
- 带@OneToMany的单向映射
本指南将向您展示如何绘制地图以及每种方法的优缺点
考虑图书馆和书籍之间的关系。一个图书馆可能有很多书,一本书只能由一个图书馆管理
使用@OneToMany和@ManyToOne进行双向映射
@OneToMany将放置在实体(或一侧)的集合关联上,该属性指向关系所有者mappedBy
@Entity
public class Library {
...
@OneToMany(mappedBy = "library", cascade = CascadeType.ALL)
private Set<Book> books = new HashSet<>();
...
}
@ManyToOne将放置在实体(或关系所有者,基础数据库中具有外键列的表)的单个项目关联上
@Entity
public class Book {
...
@ManyToOne(fetch = FetchType.LAZY, optional = false)
@JoinColumn(name = "library_id")
private Library library;
...
}
@JoinColumn指定外键列。对于双向映射是可选的,默认名称为关联字段名称及其主键列名称的下划线字符串连接
相反,需要为双向映射指定@OneToMany上的属性。如果 不存在,JPA 和休眠将创建冗余连接表mappedBy
mappedBy
library_books
+------------+---------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+------------+---------+------+-----+---------+-------+
| library_id | int(11) | NO | PRI | NULL | |
| books_id | int(11) | NO | PRI | NULL | |
+------------+---------+------+-----+---------+-------+
优点和缺点
- 关系的两个实体可以快速访问并相互级联 CRUD 操作
- @OneToMany可能会导致大型子集合出现性能问题
带@ManyToOne的单向映射
@ManyToOne将放置在实体的单个项目关联上(或放置在基础数据库中具有外键列的表上)。父实体上没有子集合关联映射
@Entity
public class Book {
...
@ManyToOne(fetch = FetchType.LAZY, optional = false)
@JoinColumn(name = "library_id")
private Library library;
...
}
@JoinColumn指定外键列。对于单向@ManyToOne映射,默认名称为关联字段名称及其主键列名称的下划线字符串连接是可选的
优点和缺点
- 避免@OneToMany的潜在性能问题
- 父实体无法将 CRUD 操作导航或级联到子集合。但是,您可以通过JPQL查询手动执行此操作
动手教程
带@OneToMany的单向映射
@OneToMany将放置在具有@JoinColumn且没有映射的实体(或单侧)的子集合上
我们不需要在单向@OneToMany上指定 mapBy 属性,因为子实体上没有父关联映射
@Entity
public class Library {
...
@OneToMany(cascade = CascadeType.ALL)
@JoinColumn(name = "library_id")
private Set<Book> books = new HashSet<>();
...
}
@JoinColumn指定单向@OneToMany的外键列是必需的。如果不存在@JoinColumn,JPA 和休眠将创建冗余连接表library_books
+------------+---------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+------------+---------+------+-----+---------+-------+
| library_id | int(11) | NO | PRI | NULL | |
| books_id | int(11) | NO | PRI | NULL | |
+------------+---------+------+-----+---------+-------+
复制
优点和缺点
- 父实体可以快速访问 CRUD 操作并将其级联到子集合
- 子实体无法导航父实体
- @OneToMany可能会导致大型子集合出现性能问题
在本文中,我们快速浏览了在JPA和Hibernate中映射一到多和多对一关系的各种方法,以及有关其优缺点的说明