创建仓库
修改仓库
插入数据源
使用该方法前必须添加一个数据源到 SQL Date Tool
生成实体类
1. 表的结构为 Spring Security 用户-角色-权限多对多模型
2. 创建实体类的关联关系需要勾选References 选项
3. 若依赖中含有Lombok JPA Buddy 会自动生成 Getter 和 Setter 方法
4. 实体类创建完成后需要为 IntelliJ IDEA 的自动检查配置一个数据源
使用乐观锁
乐观锁由 孔祥重教授指出通过对比不同线程之间的版本号字段来保证数据库中数据一致性和系统吞吐
量,适用于低并发的环境中,可以搭配 spring-retry 进行并发重试。
使用审计功能
* 在 JPA 中,审计是对表中记录的创建/修改时间,创建/修改者的记录
createdBy 和 updatedBy 需要在和 Spring Security 集成时可被自动设置,此处略
添加查询方法
添加模糊查询
支持的关键字有 StartsWith、EndsWith...
添加修改方法
修改方法必须添加 Modifying 注解,避免异常
使用该方式书写JPQL 语句时,应先选择 Add update value assignment ,在选择 Add Query Condition ,可根据个人习惯自行调整
添加范围查询
添加排序方法
可以向方法中添加 Sort 参数自定义排序规则
添加删除方法
添加关联查询
EntityGraph 可以优雅的解决懒加载异常和 N + 1 问题
添加分页查询
真正的测试需要使用 assert 语句或 mock 语句,这里仅作演示
提取查询语句
重载字符串方法
JPA Buddy 生成的 toString 方法并不包含关联属性,从而避免懒加载异常
在 Add Lifecycle Callback method 除了 toString 方法外还有 equals方法、hashCode方法和生命周期方法
映射到数据定义语言
其他
* 不同数据库的默认隔离级别不同,多数据库环境下应查阅相关文档
* CrudRepository 中的 save 方法在是通过数据库中的主键执行更新操作
* CrudRepository 中的 save 方法既可以执行插入操作也可以执行更新操作
* CrudRepository 中的 save 方法执行更新前会进行一次查询操作,来确定是执行插入操作还是更新操作
* Spring Data JPA 完成了对 Hibenate 的抽象,减少了 Hibernate 和 JPA 配置的繁琐,提高了开发效率
悲观锁
// 由于自动提交的存在在 ORM 中较为难以演示,此处给出代码
public interface OrderRepository extends JpaRepository<Order, Integer> {
@Lock(LockModeType.PESSIMISTIC_WRITE) // 相当于 for update
@Transactional(isolation = Isolation.SERIALIZABLE) // for update 通常搭配序列化事务隔离级别
List<Order> findByIdBetween(Integer idStart, Integer idEnd);
} // 更新失败抛出:PessimisticLockingFailureException
//-------------------------------------------------//
public interface OrderRepository extends JpaRepository<Order, Integer> {
@Lock(LockModeType.PESSIMISTIC_READ) // 相当于 for share
@Transactional(isolation = Isolation.REPEATABLE_READ) // for update 通常搭配可重复读事务隔离级别
List<Order> findByIdBetween(Integer idStart, Integer idEnd);
} // 更新失败抛出:PessimisticLockingFailureException
锁的降级
* 在 JPA 中锁按照以下顺序降级 PESSIMISTIC_WRITE --> PESSIMISTIC_FORCE_INCREMENT --> PESSIMISTIC_READ --> OPTIMISTIC_FORCE_INCREMENT --> OPTIMISTIC --> READ --> NONE
不使用乐观锁