spring boot 学习手册
  • 介绍
  • 基础教程
    • 1.RESTfull API简单项目的快速搭建
    • 2.配置文件详解:Properties和YAML
    • 3.配置文件-多环境配置
    • 4.日志配置-logback和log4j2
  • web应用开发
    • 1.模板引擎
    • 2.模板引擎FreeMarker
    • 3.模板引擎Thymeleaf
    • 4.模板引擎jsp
    • 5.错误处理
    • 6.Servlets, Filters, listeners
    • 7.CORS支持
    • 8.文件上传
    • 9.Interceptor拦截器
    • 10.AOP统一处理Web请求日志
    • 11.全局统一异常处理
    • 12. Retry重试
    • 13.RestTemplate
  • 关系型数据库
    • 1.JdbcTemplate
    • 2.Spring-data-jpa
      • @Id 和 @GeneratedValue 详解
      • 配置与注解备注
      • 全局统一前缀策略
      • 映射关系详解
      • 查询、分页、排序
      • JPA 资料
      • 进阶:jpa自定义行为方法
      • 进阶:锁
      • 进阶:Hibernate Validator
    • 3.事务处理
  • NoSQL数据库
    • 1.Redis
    • 2.Mongodb
  • Cache
    • 1.EhCache
    • 2.Redis
  • 异步消息服务
    • 1.JMS(ActiveMQ)
    • 2.AMQP(RabbitMQ)
  • Mybatis
    • Mybatis 初使用
    • Mybatis环境搭建
    • Mybatis开发流程
    • 业务开发流程
    • Mybatis资料
  • 进阶
    • 1.调用REST服务-使用代理
    • 2.发送邮件
    • 3.Spring Session实现集群-redis
    • 4.如何进行远程调试
    • 5.生产准备-基于HTTP的监控
    • 6.Spring Boot集成mybatis
    • 7.Spring Boot集成Druid
    • 8.Spring Boot集成Swagger
    • 9.生产部署-注意事项和如何使用脚本
  • 升华
    • Jenkins部署Spring Boot
    • 异步处理Http请求
    • FastDFS
    • Docker
    • 定时任务(corn job)
    • 批处理
    • @Async实现异步调用
  • 单元测试
    • WireMock伪造服务
  • 安全
    • 1.Spring Security
      • 认证
    • 2.Apache Shiro
  • TaskExecutor 异步线程池
  • 其他
    • 1.修改启动时显示
    • 2.获取配置文件中的值
    • 3.嵌入式容器
    • 4.配置SSL
    • 5.websocket
    • 6.Spring IO Platform
  • RESTfull API 开发
  • 附录:Eclipse - Spring Tool Suite工具的安装
  • 附录:Eclipse部署Maven
  • 附录:SpringBoot相关模块
  • 附录:注解笔记
  • 资料
  • 开发技巧
  • maven插件
Powered by GitBook
On this page
  • @OneToOne 一对一关系
  • @OneToMany 一对多, @ManyToOne 多对一
  • @Embedded, @Embeddable 嵌入式关系
  • @ElementCollection 集合一对多关系
  • 资料

Was this helpful?

  1. 关系型数据库
  2. 2.Spring-data-jpa

映射关系详解

Previous全局统一前缀策略Next查询、分页、排序

Last updated 5 years ago

Was this helpful?

表关系映射(双向映射):

  • @OneToOne 一对一关系

  • @OneToMany 一对多

  • @ManyToMany(不推荐使用,而是采用用中间对象,把多对多拆成两个对多一关系,如下书 与作者 的关系例子,还可以使用中间表用来搜索)

字段映射(单向映射):

  • @Embedded, @Embeddable 嵌入式关系(单向映射)

  • @ElementCollection 集合一对多关系(单向映射)

注意:

fetch 为关键映射的一个加载策略

fetch的默认值:FetchType.EAGER,也就是加载的时候把响应的映射关系数据也加载出来

如果这不适合于应用程序或特定的持久字段,请将fetch设置为FetchType.LAZY,延迟加载,只要getxxxx(),具体获取时,再次执行一条sql语句获取

@OneToOne 一对一关系

@OneToOne 属性

比如作者和作者详情信息(一些不常用信息),就是一个一对一

Author.java

@Entity
public class Author {
    @OneToOne
    private AuthorInfo info;
    ...... 省略其他
}

AuthorInfo.java

@Entity
public class AuthorInfo {

    private String school;

    @OneToOne(mappedBy = "info")
    private Author author;

    ......省略其他
}

无属性的一方拥有管理权,也就是author 表中会多出来一个字段info_id

@OneToMany 一对多, @ManyToOne 多对一

注意一对多关系映射时,“One”端采用@OneToMany 注释时必须使用mappedBy来指定Many端的对象的哪个属性提供了对应的关系映射。

避免建立单向关系映射,以免产生新的中间表,而采用双向映射关系(这样many 的一端只会使用外键方式来维护关系)

@ManyToOne 的属性

@OneToMany 属性

一本书有多个作者(OneToMany 一对多), 而书和作者表中,("spring boot", revin")只能属于一本书(ManyToOne 多对一)

Book.java

@Entity
public class Book {

    private String name;

    @OneToMany(mappedBy = "book")
    private List<BookAuthor> authors;

    .....省略
}

一个作者出版了多本书(OneToMany 一对多), 而书和作者表中,("spring boot", revin")只能属于一个作者(ManyToOne 多对一)

Author.java

@Entity
public class Author {
    @OneToMany(mappedBy = "author")
    //@OrderBy("book.name ASC")
    private List<BookAuthor> books;
     .....省略
}

BookAuthor .java

@Entity
public class BookAuthor {

    @ManyToOne
    private Book book;

    @ManyToOne
    private Author author;
    .....省略
}

比如一本书可以分属于多个栏目(OneToMany 一对多),而同一个栏目 只能有一本相同的书(ManyToOne 多对一)

Book.java

@Entity
public class Book {

    private String name;

    @ManyToOne
    private Category category;

    .....省略
}

Category.java

public class Category {
@OneToMany(mappedBy = "category")
    private List<Book> books;

    ......省略其他
}

@Embedded, @Embeddable 嵌入式关系

意思就是说当你有一个用户信息表中,这个人有地址信息,而地址信息有可能别的类有其他的关系映射,所以需要独立处理,但是address表中的字段,你有需要在用户表中存在这可以这种嵌入式关系。

@Embedded嵌入Address 类

@Entity
public class Author {
    @Embedded
    private Address address;
    ......  省略其他
}

@Embeddable声明Address 类是可嵌入的

@Embeddable
public class Address {

    private String province;

    private String city;

    private String area;

    private String address;

    private String zipcode;

    ...... 省略其他

}

最后生成出来 author表中会包含province,city,area,address,zipcode这些字段。

@ElementCollection 集合一对多关系

@Entity
public class Author {

    @id
    @GeneratedValue
    private long id

    @ElementCollection
    private List<String> hobbies;
    ......  省略其他
}

生成效果为:数据表会出现一张新表为author_hobbies,并且字段名为author_id 和 hobbies , Author表与hobbies表产生了一个一对 的关系。

当你插入和获取用户信息的时,jpa会自动关联。

再举例子

当一个用户有多个地址,比如在电子商务场景中,会有多个收货地址

@Entity
public class Author {

    @ElementCollection
    private List<Address> addresses;
    ......  省略其他
}

也会重新生成一张新表,并且字段名是Address类定义的字段。Author与addresses产生一个一对的关系。

资料

- 推荐当手册用

1JPA 批注参考
hibernate jpa中 的 fetch