用途
该技能用于掌握 Java 应用中的数据持久化,基于 JPA 与 Hibernate 构建生产级持久层。它覆盖实体设计、Hibernate 优化、Spring Data 仓库、查询策略与缓存,重点在于防止 N+1 查询并提升持久层性能。
主要能力
实体设计
- 实体映射注解
- 关系类型(1:1、1:N、N:M)
- 继承策略
- 生命周期回调
- 审计(Auditing)
查询优化
- 防止 N+1 问题
- JOIN FETCH 与 EntityGraph 对比
- 批量抓取(Batch fetching)
- 投影与 DTO
事务
- @Transactional 配置
- 传播与隔离级别
- 乐观锁与悲观锁
- 死锁预防
缓存
- 一级与二级缓存
- 查询缓存
- 缓存失效
- Redis 集成
使用方式
通过技能调用方式使用:
Skill("java-jpa-hibernate")
技能内提供了实体、审计基类、仓库查询优化的代码示例,以及 Hibernate 配置片段。
实体与关系示例
// Entity with relationships
@Entity
@Table(name = "orders")
public class Order {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "customer_id", nullable = false)
private Customer customer;
@OneToMany(mappedBy = "order", cascade = CascadeType.ALL, orphanRemoval = true)
@BatchSize(size = 20)
private List<OrderItem> items = new ArrayList<>();
@Version
private Long version;
// Bidirectional helper
public void addItem(OrderItem item) {
items.add(item);
item.setOrder(this);
}
}
// Auditing base class
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
public abstract class Auditable {
@CreatedDate
@Column(updatable = false)
private Instant createdAt;
@LastModifiedDate
private Instant updatedAt;
}
仓库查询优化示例
// Repository with query optimization
public interface OrderRepository extends JpaRepository<Order, Long> {
// JOIN FETCH to prevent N+1
@Query("SELECT DISTINCT o FROM Order o JOIN FETCH o.items WHERE o.status = :status")
List<Order> findByStatusWithItems(@Param("status") Status status);
// EntityGraph alternative
@EntityGraph(attributePaths = {"items", "customer"})
Optional<Order> findById(Long id);
// DTO Projection
@Query("SELECT new com.example.OrderSummary(o.id, o.status, c.name) " +
"FROM Order o JOIN o.customer c WHERE o.id = :id")
Optional<OrderSummary> findSummaryById(@Param("id") Long id);
}
N+1 预防策略
| 策略 | 使用时机 | 示例 |
|---|---|---|
| JOIN FETCH | 总是需要关联 | JOIN FETCH o.items |
| EntityGraph | 动态抓取 | @EntityGraph(attributePaths) |
| @BatchSize | 集合访问 | @BatchSize(size = 20) |
| DTO Projection | 只读查询 | new OrderSummary(...) |
Hibernate 配置示例
spring:
jpa:
open-in-view: false # Critical!
properties:
hibernate:
jdbc.batch_size: 50
order_inserts: true
order_updates: true
default_batch_fetch_size: 20
generate_statistics: ${HIBERNATE_STATS:false}
datasource:
hikari:
maximum-pool-size: 20
minimum-idle: 5
leak-detection-threshold: 60000
常见问题排查
| 问题 | 原因 | 解决方案 |
|---|---|---|
| N+1 查询 | 循环中懒加载 | JOIN FETCH、EntityGraph |
| LazyInitException | 会话已关闭 | DTO 投影 |
| 慢查询 | 缺少索引 | EXPLAIN ANALYZE |
| 连接泄漏 | 缺少 @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 日志
- 检查每个请求的查询数量
- 验证抓取策略
- 审查 @Transactional
- 检查连接池
适用场景
在以下情况使用该技能:
- 设计带关系的 JPA 实体
- 优化数据库查询
- 为性能配置 Hibernate
- 实现缓存策略
- 调试持久化问题
限制
资料未提供该技能的具体版本要求、依赖环境、安装步骤、收费模式或平台限制等信息,暂未提供。相关技能包括 java-performance(查询优化)与 java-spring-boot(Spring Data)。