Pular para o conteúdo
Skillpedia
Código em geral280 mil · #67

jpa-patterns

Ajuda seu agente a usar padrões JPA/Hibernate de forma eficiente. Melhora o design de entidades, consultas e o gerenciamento de transações em aplicações Spring Boot.

O que ela faz

Este guia ensina como organizar e otimizar o acesso a dados em aplicativos Java usando JPA e Hibernate. Ele mostra como criar modelos de dados eficientes, melhorar a velocidade das consultas e gerenciar transações e conexões com o banco de dados.

Quando usar

  • ✓Ao criar as tabelas e os relacionamentos entre elas no banco de dados.
  • ✓Quando as consultas ao banco de dados estão lentas ou apresentando erros.
  • ✓Ao configurar como o aplicativo se conecta e gerencia as conexões com o banco de dados.

Exemplo do que pedir para a IA

“Como posso otimizar minhas consultas JPA para evitar o problema N+1?”

Quer saber mais? Abra as seções abaixo.

Como usar

O jeito mais fácil: copie a mensagem abaixo e cole no Claude, ChatGPT, Cursor ou outra IA. Ela lê a skill e segue as instruções.

Link da skill

https://github.com/affaan-m/ECC/blob/main/pi/core/skills/jpa-patterns/SKILL.md

Mensagem pronta para colar

Use esta skill para me ajudar: https://github.com/affaan-m/ECC/blob/main/pi/core/skills/jpa-patterns/SKILL.md Leia o arquivo SKILL.md desse link e siga as instruções dele na minha tarefa.
Como funciona

Ele fornece exemplos de código e explicações sobre como usar anotações do JPA/Hibernate para definir tabelas, relacionamentos e otimizar o desempenho. Também aborda configurações para transações, paginação e conexões com o banco de dados.

Instalação

Jeito mais fácil: copie o link da skill e cole no Claude, ChatGPT ou Cursor pedindo para seguir as instruções.

No terminal (Claude Code, Codex, Cursor), na pasta do projeto:

npx skills add affaan-m/ECC --skill jpa-patterns

Ou baixe só o arquivo:

curl -L https://raw.githubusercontent.com/affaan-m/ECC/main/pi/core/skills/jpa-patterns/SKILL.md -o SKILL.md
Conteúdo técnico (SKILL.md)

Tradução do texto original do autor no GitHub. Os comandos e códigos estão como no original.

Padrões JPA/Hibernate

Use para modelagem de dados, repositórios e otimização de performance no Spring Boot.

Quando Ativar

  • Projetando entidades JPA e mapeamentos de tabelas
  • Definindo relacionamentos (@OneToMany, @ManyToOne, @ManyToMany)
  • Otimizando consultas (prevenção de N+1, estratégias de fetch, projeções)
  • Configurando transações, auditoria ou exclusões lógicas (soft deletes)
  • Configurando paginação, ordenação ou métodos de repositório customizados
  • Ajustando pooling de conexões (HikariCP) ou cache de segundo nível

Design de Entidades

@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;
}

Habilite auditoria:

@Configuration
@EnableJpaAuditing
class JpaConfig {}

Relacionamentos e Prevenção de N+1

@OneToMany(mappedBy = "market", cascade = CascadeType.ALL, orphanRemoval = true)
private List<PositionEntity> positions = new ArrayList<>();
  • Use lazy loading por padrão; utilize JOIN FETCH em consultas quando necessário
  • Evite EAGER em coleções; use projeções DTO para caminhos de leitura
@Query("select m from MarketEntity m left join fetch m.positions where m.id = :id")
Optional<MarketEntity> findWithPositions(@Param("id") Long id);

Padrões de Repositório

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);
}
  • Use projeções para consultas leves:
public interface MarketSummary {
  Long getId();
  String getName();
  MarketStatus getStatus();
}
Page<MarketSummary> findAllBy(Pageable pageable);

Transações

  • Anote métodos de serviço com @Transactional
  • Use @Transactional(readOnly = true) para caminhos de leitura para otimizar
  • Escolha a propagação com cuidado; evite transações de longa duração
@Transactional
public Market updateStatus(Long id, MarketStatus status) {
  MarketEntity entity = repo.findById(id)
      .orElseThrow(() -> new EntityNotFoundException("Market"));
  entity.setStatus(status);
  return Market.from(entity);
}

Paginação

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

Para paginação estilo cursor, inclua id > :lastId em JPQL com ordenação.

Indexação e Performance

  • Adicione índices para filtros comuns (status, slug, chaves estrangeiras)
  • Use índices compostos que correspondam aos padrões de consulta (status, created_at)
  • Evite select *; projete apenas as colunas necessárias
  • Agrupe escritas com saveAll e hibernate.jdbc.batch_size

Pooling de Conexões (HikariCP)

Propriedades recomendadas:

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

Para tratamento de LOB no PostgreSQL, adicione:

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

Caching

  • O cache de 1º nível é por EntityManager; evite manter entidades entre transações
  • Para entidades com muitas leituras, considere o cache de 2º nível com cautela; valide a estratégia de expiração

Migrações

  • Use Flyway ou Liquibase; nunca confie no DDL automático do Hibernate em produção
  • Mantenha as migrações idempotentes e aditivas; evite remover colunas sem planejamento

Testando Acesso a Dados

  • Prefira @DataJpaTest com Testcontainers para espelhar a produção
  • Verifique a eficiência do SQL usando logs: defina logging.level.org.hibernate.SQL=DEBUG e logging.level.org.hibernate.orm.jdbc.bind=TRACE para valores de parâmetros

Lembre-se: Mantenha as entidades enxutas, as consultas intencionais e as transações curtas. Previna N+1 com estratégias de fetch e projeções, e indexe para seus caminhos de leitura/escrita.

Perguntas frequentes

O que é o problema N+1?

É um problema de desempenho onde o aplicativo faz uma consulta inicial para buscar uma lista de itens e, em seguida, faz uma consulta separada para cada item da lista, resultando em muitas consultas desnecessárias.

O que são 'projeções'?

São uma forma de pedir ao banco de dados apenas os dados que você realmente precisa, em vez de todos os dados de uma tabela, tornando as consultas mais rápidas.

O que é 'auditoria'?

É o registro automático de quando um dado foi criado ou modificado, útil para rastrear alterações.

Detalhes

Descrição original do autor

JPA/Hibernate patterns for entity design, relationships, query optimization, transactions, auditing, indexing, pagination, and pooling in Spring Boot. Use when designing JPA entities or relationships, or when a Hibernate query, transaction, or N+1 problem needs fixing.

repo: affaan-m/ECC

Popularidade

Estrelas no GitHub
280 mil
Posição no ranking
#67
Licença
MIT
Atualizada em
15/10/2026

Essa skill é útil?

0

Entre para votar.

Comentários

  • …

Mais skills deste repositório

Skills parecidas