SuperAPI AI 工具集

java-jpa-hibernate

编程与开发

查看项目

更新于 10-15 12:21

技能介绍

用途

该技能用于掌握 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)。