学习笔记@玩转Spring全家桶
课程内容来自极客时间玩转Spring全家桶,链接如下
https://time.geekbang.org/course/intro/100023501
第五天半
SpringDataJPA概念
为什么会存在OR Mapping这个东西
下表是Object与RDBMS关系
有了这样的不匹配的背景下,就存在了Hibernate与JDO这种对象关系映射的框架
2006年3.2 Hibernate 成为了JPA的实现,作为 JSR 220 的一部分发布
JPA全称Java Persistence API,为对象关系映射提供了一种基于 POJO 的持久化模型
- 简化数据持久化代码的开发工作
- 为 Java 社区屏蔽不同持久化 API 的差异(屏蔽JDO、EJB等)
早期Spring中支持JPA,后被单独拿出到Spring Data中,与Spring Data Common、Spring Data JDBC等,同为Spring Data 模块
定义JPA实体对象
使用注解来定义实体:
JPA 注解
实体
- @Entity 定义该类是实体
- @MappedSuperclass 多个实体的类的父类
- @Table(name) 实体和对应的表关联起来
主键
- @Id 主键
- @GeneratedValue(strategy, generator) 生成策略:自增序类、生成器等
- @SequenceGenerator(name, sequenceName) 生成序列
映射
- @Column(name, nullable, length, insertable, updatable) 定义属性与表里字段的映射关系,一般情况下属性名就是对应字段的名字;也可以在name中指定名字
- @JoinTable(name)、@JoinColumn(name) 关联时使用
关系
- @OneToOne、@OneToMany、@ManyToOne、@ManyToMany
- @OrderBy 排序
Lombok
Project Lombok 能够自动嵌入 IDE 和构建工具,提升开发效率
- @Getter / @Setter
- @ToString
- @NoArgsConstructor / @RequiredArgsConstructor / @AllArgsConstructor
- @Data 相当于 Getter / Setter + ToString
- @Builder
- @Slf4j / @CommonsLog / @Log
JPA实现逻辑
Repository Bean 是如何创建的
JpaRepositoriesRegistrar
激活了 @EnableJpaRepositories
返回了 JpaRepositoryConfigExtensio
RepositoryBeanDefinitionRegistrarSupport.registerBeanDefinitions
注册 Repository Bean(类型是 JpaRepositoryFactoryBean )
RepositoryConfigurationExtensionSupport.getRepositoryConfigurations
取得 Repository 配置
JpaRepositoryFactory.getTargetRepository
创建了 Repository
接口中的方法是如何被解释的
RepositoryFactorySupport.getRepository 添加了Advice
DefaultMethodInvokingMethodInterceptor
QueryExecutorMethodInterceptor
AbstractJpaQuery.execute执行具体的查询