Skip to content
cccskills
FreePublished on GitHub

jpa-patterns

JPA/Hibernate 模式,涵盖 Spring Boot 中的实体设计、关系、查询优化、事务、审计、索引、分页和连接池。

The English summary is being prepared. Showing the original description.

See how to install

Files included (1)

  • SKILL.md4.6 KB

SKILL.md (original)

Review the instructions the agent will receive before you install.

JPA/Hibernate 模式

用于 Spring Boot 中的数据建模、仓库层(Repositories)实现和性能调优。

何时激活

  • 设计 JPA 实体(Entities)和表映射
  • 定义关联关系(@OneToMany、@ManyToOne、@ManyToMany)
  • 优化查询(防止 N+1 问题、抓取策略、投影)
  • 配置事务、审计(Auditing)或逻辑删除
  • 设置分页、排序或自定义 Repository 方法
  • 调优连接池(HikariCP)或二级缓存(Second-level Caching)

实体设计

@Entity
@Table(name = "markets", indexes = {
  @Index(name = "idx_markets_slug", columnList = "slug", unique = true)
})
@EntityListeners(AuditingEntityListener.class)
public class MarketEntity {
  @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
  private Long id;

  @Column(nullable = false, length = 200)
  private String name;

  @Column(nullable = false, unique = true, length = 120)
  private String slug;

  @Enumerated(EnumType.STRING)
  private MarketStatus status = MarketStatus.ACTIVE;

  @CreatedDate private Instant createdAt;
  @LastModifiedDate private Instant updatedAt;
}

启用审计(Auditing):

@Configuration
@EnableJpaAuditing
class JpaConfig {}

关联关系与防止 N+1 问题

@OneToMany(mappedBy = "market", cascade = CascadeType.ALL, orphanRemoval = true)
private List<PositionEntity> positions = new ArrayList<>();
  • 默认使用延迟加载(Lazy Loading);必要时在查询中使用 JOIN FETCH
  • 避免在集合上使用 EAGER;在读取路径中使用 DTO 投影(Projections)
@Query("select m from MarketEntity m left join fetch m.positions where m.id = :id")
Optional<MarketEntity> findWithPositions(@Param("id") Long id);

Repository 模式

public interface MarketRepository extends JpaRepository<MarketEntity, Long> {
  Optional<MarketEntity> findBySlug(String slug);

  @Query("select m from MarketEntity m where m.status = :status")
  Page<MarketEntity> findByStatus(@Param("status") MarketStatus status, Pageable pageable);
}
  • 对轻量级查询使用投影(Projections):
public interface MarketSummary {
  Long getId();
  String getName();
  MarketStatus getStatus();
}
Page<MarketSummary> findAllBy(Pageable pageable);

事务

  • 在 Service 方法上添加 @Transactional 注解
  • 在读取路径上使用 @Transactional(readOnly = true) 以进行优化
  • 谨慎选择传播行为(Propagation);避免长事务
@Transactional
public Market updateStatus(Long id, MarketStatus status) {
  MarketEntity entity = repo.findById(id)
      .orElseThrow(() -> new EntityNotFoundException("Market"));
  entity.setStatus(status);
  return Market.from(entity);
}

分页

PageRequest page = PageRequest.of(pageNumber, pageSize, Sort.by("createdAt").descending());
Page<MarketEntity> markets = repo.findByStatus(MarketStatus.ACTIVE, page);

对于类游标分页(Cursor-like pagination),在 JPQL 中包含 id > :lastId 并配合排序。

索引与性能

  • 为常用过滤器(status、slug、外键)添加索引
  • 使用匹配查询模式的复合索引(status, created_at)
  • 避免使用 select *;仅投影所需的列
  • 使用 saveAll 和 hibernate.jdbc.batch_size 进行批量写入

连接池 (HikariCP)

推荐属性配置:

spring.datasource.hikari.maximum-pool-size=20
spring.datasource.hikari.minimum-idle=5
spring.datasource.hikari.connection-timeout=30000
spring.datasource.hikari.validation-timeout=5000

对于 PostgreSQL 的 LOB 处理,添加:

spring.jpa.properties.hibernate.jdbc.lob.non_contextual_creation=true

缓存

  • 一级缓存(1st-level cache)是基于 EntityManager 的;避免跨事务保留实体
  • 对于读多写少的实体,谨慎考虑二级缓存(Second-level cache);验证逐出策略(Eviction Strategy)

数据库迁移 (Migrations)

  • 使用 Flyway 或 Liquibase;生产环境绝不依赖 Hibernate 的自动 DDL(auto DDL)
  • 保持迁移脚本的幂等性和增量性;避免在没有计划的情况下删除列

测试数据访问

  • 优先使用 @DataJpaTest 配合 Testcontainers 以镜像生产环境
  • 通过日志断言 SQL 效率:设置 logging.level.org.hibernate.SQL=DEBUG 以及针对参数值的 logging.level.org.hibernate.orm.jdbc.bind=TRACE

记住:保持实体精简、查询意图明确、事务简短。通过抓取策略和投影防止 N+1 问题,并为读/写路径建立索引。

Reviews

No reviews yet. Tell others what you thought.

Comments

No login needed. Share how it worked for you, ask a question, or note where it did not run.

No comments yet. Be the first to write one.

Comments are published right away. Do not include personal information such as email addresses or phone numbers. Up to 2 URLs.

0 / 1,000 characters

This form is protected by reCAPTCHA, and the Google Privacy Policy and Terms of Service apply.

More skills from this repository

生产级 API 的 REST API 设计模式,包括资源命名、状态码、分页、过滤、错误响应、版本控制和速率限制。

The English summary is being prepared. Showing the original description.

xu-xiang/everything-claude-code-zh2KUpdated Mar 5, 2026

REST API设计模式,包括资源命名、状态码、分页、过滤、错误响应、版本控制和生产API的速率限制。

The English summary is being prepared. Showing the original description.

xu-xiang/everything-claude-code-zh2KUpdated Mar 5, 2026

编写文章、指南、博客、教程、时事通讯(Newsletter)等长内容,支持从示例或品牌指南中提取独特的语感语调。适用于需要撰写超过一个段落的精炼文本,尤其是对语气一致性、结构和可信度有较高要求时。

The English summary is being prepared. Showing the original description.

xu-xiang/everything-claude-code-zh2KUpdated Mar 5, 2026

撰写文章、指南、博客、教程、时事通讯等长篇内容,并根据提供的示例或品牌指南呈现独特的语言风格。当用户需要篇幅超过一段的精炼文字,且重视风格一致性、结构和可信度时,请使用此技能。

The English summary is being prepared. Showing the original description.

xu-xiang/everything-claude-code-zh2KUpdated Mar 5, 2026

根据提供的示例或品牌指导,以独特的语气撰写文章、指南、博客帖子、教程、新闻简报等长篇内容。当用户需要超过一段的精致书面内容时使用,尤其是当语气一致性、结构和可信度至关重要时。

The English summary is being prepared. Showing the original description.

xu-xiang/everything-claude-code-zh2KUpdated Mar 5, 2026

编写文章、指南、博客帖子、教程、新闻通讯(newsletter)以及其他长篇内容。这些内容具有从提供的示例或品牌指南中提取出的独特语气。当用户需要比段落更长的精美文案,且对语气一致性、结构和可信度有要求时,请使用此技能(Skill)。

The English summary is being prepared. Showing the original description.

xu-xiang/everything-claude-code-zh2KUpdated Mar 5, 2026

See all skills by xu-xiang

Report a problem with this skill