一.O/R Mapping:对象-关系映射:域模型是面向对象的,而关系数据模型是面向关系的,O/R Mapping是建立两者之间的映射
对象与关系的范式不匹配:
对象(Object) | 关系型数据库(RDBMS) | |
粒度 | 类 | 表 |
继承关系 | 有 | 五 |
唯一性 | ==或者equals() | 主键 |
关联 | 引用 | 外键 |
数据访问 | 逐级访问 | SQL数量要少 |
二.Java Persistence API
为对象关系型映射提供了一种基于POJO的持久化模型
Hibernate是JPA的一个实现
(一) 常用注解
1.实体:
@Entity :注明为实体
@MappedSuperclass :注明为多个实体类的父类
@Table(name) :关联对应的表
2.主键:
@Id :注明字段为主键,有以下参数:
@GeneratedValue(strategy, generator) :主键生成策略以及对应的生成器
@SequenceGenerator(name, sequenceName) :指明序列
举例:
1 @Entity(name = "Product") 2 // 没有特别注明@Table注解的话,默认类名即表名 3 public static class Product{ 4 5 @Id 6 @GeneratedValue( 7 // 使用SEQUENCE作为生成策略 8 strategy = GenerationType.SEQUENCE, 9 // 使用的生成器为"sequence-generator" 10 generator = "sequence-generator" 11 ) 12 @SequenceGenerator( 13 // 定义一个名为"sequence-generator"的生成器 14 name = "sequence-generator", 15 // 对应名为"product_sequence"的序列 16 sequenceName = "product_sequence" 17 ) 18 private Long id; 19 20 @Column(name = "product_name") 21 private String name; 22 23 // Getter and Setter 24 }
3.映射:
@Column(name, nullable, lenth, insertable, updatable) :注明属性和表字段的映射关系
@JoinTable(name) 、 @JoinColumn(name) :关联
4.关系:
@OneToOne 、 @OnetoMany 、 @ManyToOne 、 @ManyToMany :表关联
@OrderBy :排序
(二) Repository
1. @EnableJpaRepositories 注解定义当前接口为 Repository
2.定义 Repository<T, ID> 接口,在 JavaConfig 上添加 @EnableJpaRepositories 注解后就可自动发现其扩展接口,泛型中指定实体对象和主键类型
3.定义查询:根据方法名定义查询,如:find...By... / read...By... / query...By... / get...By... / count...By... / ...OrderBy...[Asc/Desc]等
4.分页查询:使用 PagingAndSortingRepository<T, ID> : findAll() 方法,重载形式1.传入 Sort 类型参数,返回一个迭代器;重载形式2.传入Pageable 类型参数,返回一个 Page 类型数据
(三) Repository 从接口变成 Bean
1. JpaRepositoriesRegistrar :
激活 @EnableJpaRepositories 注解
返回 JpaRepositoryConfigExtension 类
2. RepositoryBeanDefinitionRegistrarSupport.registerBeanDefinitions :
注册 Repository Bean (类型是 JpaRepositoryFactoryBean )
3. RepositoryConfigurationExtensionSupport.getRepositoryConfigurations :
获取 Repository 配置
4. JpaRepositoryFactory.getTargetRepository :
创建 Repository
(四) 解释接口中的方法
1. RepositoryFactorySupport.getRepository 添加 Advice :
对 QueryExecutorMethodInterceptor 查询做了增强。
2. AbstractJpaQuery.execute 执行具体的查询
3.在 Part 中进行语法解析