其他
开发 JPA/Hibernate 持久层并优化查询、事务…
适用于 Java 应用中使用 JPA/Hibernate/Spring Data 设计实体、优化查询、管理事务、配置缓存和排查持久化问题的场景。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 35/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 55/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 38/100 ×0.15
适用场景
开发 JPA/Hibernate 持久层特定
解决思路
- 实体设计:使用 @Entity 和 @Table(name = "orders") 声明实体及表映射。
- 实体设计:使用 @Id 和 @GeneratedValue(strategy = GenerationType.IDENTITY) 配置主键生成。
- 实体设计:使用 @ManyToOne(fetch = FetchType.LAZY) 和 @JoinColumn(name = "customer_id", nullable = false) 配置多对一懒加载关联。
- 实体设计:使用 @OneToMany(mappedBy = "order", cascade = CascadeType.ALL, orphanRemoval = true) 配置一对多级联与孤儿删除。
- 实体设计:在集合关系上使用 @BatchSize(size = 20)。
- 实体设计:使用 @Version 字段实现版本控制/乐观锁。
- 实体设计:为双向关系添加 helper 方法,例如 items.add(item); item.setOrder(this);。
- 审计:使用 @MappedSuperclass 和 @EntityListeners(AuditingEntityListener.class) 定义可审计基类。
- 审计:使用 @CreatedDate 和 @Column(updatable = false) 记录创建时间。
- 审计:使用 @LastModifiedDate 记录更新时间。
- 关系类型:覆盖 1:1、1:N、N:M 关系映射。
- 继承策略:配置实体继承策略。
- 生命周期回调:实现实体生命周期回调。
- 查询优化:防止 N+1 问题。
- 查询优化:比较/选择 JOIN FETCH 与 EntityGraph。
- 查询优化:使用批量抓取。
- 查询优化:使用 projections 和 DTOs。
- 事务:配置 @Transactional。
- 事务:配置传播行为和隔离级别。
- 事务:选择乐观锁与悲观锁。
- 事务:防止死锁。
- 缓存:配置一级缓存和二级缓存。
- 缓存:配置查询缓存。
- 缓存:实现缓存失效。
- 缓存:集成 Redis。
- Repository:继承 JpaRepository<Order, Long>。
- Repository:用 @Query("SELECT DISTINCT o FROM Order o JOIN FETCH o.items WHERE o.status = :status") 和 @Param("status") 定义 JOIN FETCH 查询,返回 List<Order>。
- Repository:用 @EntityGraph(attributePaths = {"items", "customer"}) 定义 EntityGraph 查询,返回 Optional<Order>。
- Repository:用 @Query("SELECT new com.example.OrderSummary(o.id, o.status, c.name) FROM Order o JOIN o.customer c WHERE o.id = :id") 和 @Param("id") 定义 DTO projection 查询,返回 Optional<OrderSummary>。
- N+1 预防:总是需要关联时使用 JOIN FETCH,例如 JOIN FETCH o.items。
- N+1 预防:动态抓取时使用 EntityGraph,例如 @EntityGraph(attributePaths)。
- N+1 预防:集合访问时使用 @BatchSize,例如 @BatchSize(size = 20)。
- N+1 预防:只读查询时使用 DTO Projection,例如 new OrderSummary(...)。
- Hibernate 配置:设置 spring.jpa.open-in-view: false。
- Hibernate 配置:设置 hibernate.jdbc.batch_size: 50。
- Hibernate 配置:设置 hibernate.order_inserts: true。
- Hibernate 配置:设置 hibernate.order_updates: true。
- Hibernate 配置:设置 hibernate.default_batch_fetch_size: 20。
- Hibernate 配置:设置 hibernate.generate_statistics: ${HIBERNATE_STATS:false}。
- 数据源配置:设置 hikari.maximum-pool-size: 20。
- 数据源配置:设置 hikari.minimum-idle: 5。
- 数据源配置:设置 hikari.leak-detection-threshold: 60000。
- 故障排查:遇到 N+1 queries 时,原因是 lazy in loop,使用 JOIN FETCH、EntityGraph 解决。
- 故障排查:遇到 LazyInitException 时,原因是 Session closed,使用 DTO projection 解决。
- 故障排查:遇到 Slow queries 时,原因是 Missing index,使用 EXPLAIN ANALYZE 解决。
- 故障排查:遇到 Connection leak 时,原因是 No @Transactional,添加 @Transactional 注解解决。
- 调试:设置 spring.jpa.show-sql=true。
- 调试:设置 logging.level.org.hibernate.SQL=DEBUG。
- 调试:设置 logging.level.org.hibernate.orm.jdbc.bind=TRACE。
- 调试:设置 hibernate.generate_statistics=true。
- 调试清单:启用 SQL logging。
- 调试清单:检查 query count per request。
- 调试清单:验证 fetch strategies。
- 调试清单:审查 @Transactional。
- 调试清单:检查 connection pool。
- 使用:调用 Skill("java-jpa-hibernate")。
- 相关技能:查询优化时结合 java-performance。
- 相关技能:Spring Data 集成时结合 java-spring-boot。
适用边界 · 注意事项
- 不适用于非 Java/JPA/Hibernate 技术栈的持久层。
- 不适用于不需要关系型数据库或 ORM 的纯内存/纯计算任务。
- 不适用于无法使用 Spring Data 或 JPA 注解且必须完全手写 SQL 的项目。