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
Mensagem pronta para colar
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-patternsOu baixe só o arquivo:
curl -L https://raw.githubusercontent.com/affaan-m/ECC/main/pi/core/skills/jpa-patterns/SKILL.md -o SKILL.mdConteú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 FETCHem consultas quando necessário - Evite
EAGERem 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
saveAllehibernate.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
@DataJpaTestcom Testcontainers para espelhar a produção - Verifique a eficiência do SQL usando logs: defina
logging.level.org.hibernate.SQL=DEBUGelogging.level.org.hibernate.orm.jdbc.bind=TRACEpara 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
Comentários
- …
Mais skills deste repositório
accessibility
Ajuda seu agente a criar interfaces que todos possam usar. Garante que sites e aplicativos funcionem bem para pessoas com deficiência, como cegos ou com mobilidade reduzida.
affaan-m/ECC
agent-architecture-audit
Faz seu agente verificar se tudo está funcionando corretamente. Ele encontra e conserta problemas em sistemas de IA, garantindo que funcionem como esperado.
affaan-m/ECC
agent-eval
Ajuda seu agente a comparar diferentes ferramentas de programação de IA. Ele mede qual é mais rápido, barato e confiável para realizar tarefas específicas.
affaan-m/ECC
agent-harness-construction
Faz seu agente entender melhor como realizar tarefas. Ele otimiza as ferramentas e instruções que o agente usa para aumentar suas chances de sucesso.
affaan-m/ECC
Skills parecidas
karpathy-guidelines
Ajuda seu agente a escrever código melhor, evitando erros comuns. É útil para garantir que o código seja simples, claro e fácil de verificar.
multica-ai/andrej-karpathy-skills
skill-creator
Permite ao agente criar, modificar e otimizar habilidades. Útil para testar o desempenho de habilidades e melhorar sua precisão.
anthropics/skills
ponytail-debt
Lista todos os atalhos de código ('shortcut:') deixados para depois. Ajuda a ver o que ainda precisa ser corrigido no projeto.
DietrichGebert/ponytail