提供 Spring Boot 中 JPA/Hibernate 设计、优化与事务治理实践模式
复制安装指令,让 AI 自动完成配置 · 推荐新手
请帮我安装 askskill 上的 "jpa-patterns" 技能: 1. 下载 https://raw.githubusercontent.com/affaan-m/ECC/main/docs/tr/skills/jpa-patterns/SKILL.md 2. 保存为 ~/.claude/skills/jpa-patterns/SKILL.md 3. 装好后重载技能,告诉我可以用了
请为一个电商系统设计 JPA 实体模型,包含 User、Order、OrderItem、Product 四个实体。要求说明一对多、多对一关系如何映射,何时使用懒加载,如何避免双向关联带来的序列化问题,并给出 Spring Boot + Hibernate 示例代码。
一套结构清晰的实体设计方案,包含关联注解、加载策略说明及可运行示例代码。
我有一个订单查询接口,使用 Spring Data JPA 分页返回订单列表,但响应很慢。请分析可能的 N+1 查询、索引缺失和 count 查询开销问题,并给出使用 fetch join、EntityGraph、索引设计和分页优化的改进方案。
针对 JPA 查询瓶颈的诊断与优化建议,附带示例查询和性能改进思路。
请为一个库存扣减与订单创建流程设计 Spring Boot 的事务方案。要求说明事务边界、传播行为、回滚策略,以及如何使用 JPA auditing 记录创建时间、更新时间和操作人,并补充连接池配置建议。
完整的事务治理与审计设计建议,包含注解示例、配置要点和常见陷阱说明。
Spring Boot'ta veri modelleme, repository'ler ve performans ayarlaması için kullanın.
@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'i etkinleştir:
@Configuration
@EnableJpaAuditing
class JpaConfig {}
@OneToMany(mappedBy = "market", cascade = CascadeType.ALL, orphanRemoval = true)
private List<PositionEntity> positions = new ArrayList<>();
JOIN FETCH kullanEAGER kullanmaktan kaçın; okuma yolları için DTO projections kullan@Query("select m from MarketEntity m left join fetch m.positions where m.id = :id")
Optional<MarketEntity> findWithPositions(@Param("id") Long id);
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);
}
public interface MarketSummary {
Long getId();
String getName();
MarketStatus getStatus();
}
Page<MarketSummary> findAllBy(Pageable pageable);
@Transactional ile işaretle@Transactional(readOnly = true) kullan@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 benzeri sayfalama için, sıralama ile birlikte JPQL'de id > :lastId ekle.
status, slug, foreign key'ler)status, created_at)select * kullanmaktan kaçın; sadece gerekli sütunları project etsaveAll ve hibernate.jdbc.batch_size ile yazmaları batch'leÖnerilen özellikler:
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 işleme için ekle:
spring.jpa.properties.hibernate.jdbc.lob.non_contextual_creation=true
…
通过双评审智能体对结果进行对抗式校验,提升输出发布前的可靠性
帮助你规划与实现 Spring Boot 后端架构、接口与常用工程模式。