```java
public class Category {
@ManyToMany(targetEntity = Book.class, fetch = FetchType.EAGER)
@JoinTable(
//多对多查询将会添加一张中间表,该中间表SpringDataJpa会自动创建
name = "book_category_middle",
//category_id 对应 Category.id 属性名,将会在中间表中存储 category_id 物理外键
joinColumns = {@JoinColumn(name = "category_id", referencedColumnName = "id")},
//book_id 对应 Book.id 属性名,将会在中间表中存储 book_id 物理外键
inverseJoinColumns = {@JoinColumn(name = "book_id", referencedColumnName = "id")}
)
private List<Book> bookList;
}
```
```java
public class Book {
//bookList 对应 Category.bookList 属性名
@ManyToMany(mappedBy = "bookList", fetch = FetchType.EAGER)
private List<Category> categoryList;
}
```
>[warning] 如果你使用 lombok 请查看章节【注意事项】,了解一些细节。
- MapStruct属性映射
- MapStruct是什么
- maven依赖
- 基本映射
- 字段名不一致的映射
- 字段类型不一致的映射
- 基本数据类型转换
- 日期格式转换
- 使用表达式转换
- 枚举映射
- 多个源类的映射
- 集合的映射
- 添加自定义映射方法
- 映射前后
- 添加默认值
- 映射异常处理
- SpringDataJPA
- SpringDataJPA是什么
- 与JPA、Hibernate的关系
- 环境搭建
- 简单CURD操作
- 内部原理
- 主键生成策略
- 联合主键
- 查询方式
- 方法命名规则查询
- 限制查询结果查询
- 注解@Query查询
- 命名参数查询
- SpEL表达式查询
- 原生查询
- 更新与删除
- Specification动态查询
- 核心接口
- 查询例子
- 分页查询与排序
- 多表查询
- 一对一查询
- 一对多查询
- 多对多查询
- 注意事项
- Specification多表查询
- @Query多表查询
- 只查询指定字段
- 级联操作
- 加载规则