Galho 10 — Persistência de dados (Java Senior) — Implementation Plan
For agentic workers: REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (
- [ ]) syntax for tracking.
Goal: Criar o Galho 10 da trilha Java Senior — 17 notas atômicas (camada de persistência, entidade JPA, persistence context, Spring Data repositories, relacionamentos, fetch/N+1, queries JPQL/native, projections, paginação, transações operacionais, locking, caching, Specifications/Criteria, migrations, capstone) em 3 fases + MOC do galho + expansão do Dicionário + ativação do MOC central + poda de DOIS troncos (integral do Backend/Spring Data JPA.md + cirúrgica da seção de transações do Backend/Spring Boot.md) + quitação de 11 ponteiros inline + 3 parágrafos de fronteira de dívida reversa.
Architecture: Padrão galhos + 3 fases (Iniciado/Adepto/Magus). Pasta flat 03-Dominios/Java/Persistência de dados/, notas publish: true em PT-BR, numeração global 01-17 (5/6/6). Galho HÍBRIDO: REFATOR (o tronco Spring Data JPA.md inteiro é higienizado e migrado pras notas, depois podado integral; a seção ## Gerenciamento de transações do Spring Boot.md é refinada e podada cirúrgica) + PESQUISA (afirmações version-specific — Hibernate/Spring Data version, UUID JPA 3.1, Flyway vs Liquibase — confirmadas via WebFetch). TRIPLA fronteira-assinatura: cada conceito que operacionaliza uma spec linka de volta ao Galho 7 (JPA/EntityManager/JTA) sem re-explicar; o @Transactional linka o mecanismo do Galho 8 (proxy AOP/self-invocation); o que toca a borda (entidade vs DTO) linka o Galho 9 (serialização/validação). Galhos 11/12/13/16 = texto “(planejado)”, sem wikilink. Direto na main (feedback_galhos_direto_main); push manual do usuário.
Tech Stack: Obsidian Flavored Markdown, frontmatter YAML, wikilinks, callouts, Dataview, Quartz v4. Verificação via WebFetch (docs.spring.io/spring-data/jpa/, hibernate.org/orm/documentation, jakarta.ee/specifications/persistence/, documentation.red-gate.com/fd, docs.liquibase.com).
Convenções aplicadas a TODAS as notas (ler antes de qualquer task)
Frontmatter (ajustar title/fase/tags/aliases por nota; created/updated: 2026-06-09):
---
title: "<título sem prefixo numérico>"
created: 2026-06-09
updated: 2026-06-09
type: concept
progress: backlog
status: seedling
publish: true
fase: iniciado | adepto | magus
tags:
- java
- persistencia
- <fase>
- <1-3 tags de conceito: jpa, hibernate, entidade, relacionamentos, fetch, n-mais-1, spring-data, jpql, projection, paginacao, transacao, locking, cache, migrations>
aliases:
- <aliases>
---H1 # Título após o frontmatter (padrão dos galhos publicados).
Estrutura H2 obrigatória (nesta ordem):
> [!abstract] TL;DR— 2-4 linhas. Callout, NÃO H2.## O que é— definição.## Por que importa— relevância pra senior/entrevista. (Pode fundir com “O que é” em Iniciado curtas.)## Como funciona— H3s; mínimo 3 em Adepto/Magus.## Na prática— código compilável; framing neutro; NUNCA 1ª pessoa,Patient,Doctor,Appointment,Josenaldo,MedEspecialista. Domínios neutros:Order,Customer,Product,OrderRepository,CustomerService. Records pra DTO/projection. Importsjakarta.persistence.*(Boot 3).## Armadilhas— ≥2 (Iniciado) / ≥3 (Adepto/Magus). Cada uma:### (N) Título+ descrição + exemplo curto + fix em 1 linha.## Em entrevista—### Frase pronta (inglês)com 3+ sentenças (trade-off + decisão + caveat) +### Vocabulário6+ termos em tabela| Termo PT | Termo EN |.## Veja também— wikilinks SEM backticks, SEM âncoras same-file[[#|...]]. Sempre: notas do galho +[[03-Dominios/Java/Persistência de dados/index|Persistência de dados (MOC do galho)]]+[[03-Dominios/Java/index|Trilha Java]]+ (quando operacionalizar spec) a nota do Galho 7 + (quando usar o mecanismo do@Transactional) a nota do Galho 8 + (quando tocar DTO/borda) a nota do Galho 9 + verbetes do Dicionário.## Referências— docs oficiais consultadas (docs.spring.io/spring-data/jpa/...,hibernate.org/...,jakarta.ee/..., Flyway/Liquibase docs).
Tamanho: 200-500 linhas (densas até 600 — limite de feedback_notas_atomicas).
Restrições absolutas:
- TRIPLA fronteira-assinatura. Mapeamento de link-back Galho 7 (a spec, não re-explicar):
@Entity/@Id/contrato de mapeamento → JPA 09; persistence context/EntityManager/ciclo de vida (conceito) → EntityManager 10; demarcação transacional/JTA → JTA 11. Mapeamento de link-back Galho 8 (o mecanismo do@Transactional): o proxy que intercepta → AOP 09; os limites (self-invocation,private/final) → Self-invocation 10. Mapeamento de link-back Galho 9 (a borda): entidade vaza no JSON → DTO → Serialização JSON 05; validação de negócio (service) vs formato (borda) → Validação na borda 08. - Galhos 11-16 só como texto “(planejado)”, SEM wikilink. Greps de review checam
\[\[[^]]*(Galho (11|12|13|16)|WebFlux|R2DBC|reativ|Spring Security|@DataJpaTest|Testcontainers|saga|CQRS|sharding). - Sem fabricação (feedback_no_fabrication); os dois troncos são contraexemplo (
Patient/Doctor/Appointment/“incidente memorável” do MedEspecialista/1ª pessoa — NUNCA copiar; usarOrder/Customer/Product); zero estatística de adoção inventada (regra dos Galhos 5-9) — vale pra “Flyway vs Liquibase” e pra capstone. - Pesquisa pras partes version-specific: notas 02/16/17 fundam-se em WebFetch (Step 1); qualquer outra que cravar versão também confirma. Toda afirmação version-specific verificada: versão atual do Hibernate ORM (baseline 6.x) e do Spring Data JPA; Jakarta Persistence 3.2 (EE 11 — cravado no Galho 7);
@GeneratedValuestrategies (IDENTITY/SEQUENCE/TABLE/AUTO/UUID na JPA 3.1);@Transactional(readOnly); Flyway vs Liquibase atuais. Boot 4.x/Hibernate 7.x já são as releases atuais — manter 3.x/6.x como baseline (como os Galhos 8/9), citando 4/7 como “mais recente” quando relevante. Nada de memória. - Não re-explicar o que é de outro galho: spec JPA/EntityManager/persistence context (conceito)/JTA → Galho 7 (linkar); o proxy AOP que faz o
@Transactional/self-invocation → Galho 8 (linkar); DTO/serialização/validação na borda → Galho 9 (linkar); R2DBC/persistência reativa → Galho 11 (texto); segurança de dados/row-level → Galho 12 (texto);@DataJpaTest/Testcontainers/slices → Galho 13 (texto — citar que se testa com banco real, sem ensinar a stack); saga/CQRS/sharding/event sourcing → Galho 16 (texto). Teoria SQL/ACID/isolamento → Banco de dados (linkar). Concorrência de baixo nível → Galho 4 (linkar). - Comparações justas (quando X E quando Y): LAZY vs EAGER,
@EntityGraphvsJOIN FETCHvs projection,PagevsSlice, optimistic vs pessimistic,@OneToManyvs entidade associativa, Flyway vs Liquibase, JPA vs jOOQ/JdbcClient. - Code fences:
```java,```sql(DDL/migration),```properties/```yaml(config),```json(payloads),```bash,```text. Sempre fechadas. - Commits: sem
Co-Authored-By: Claude; sem--no-verify;git add <path>nominal (bot de backup roda em timer — NUNCA-A; guardar contra.git/index.lock); 1 commit por nota; direto namain; sem push, sem deploy. Subagents NÃO rodam git — o controlador commita.
Modelo por nota: sonnet por padrão; opus nas 01 (assinatura/tripla fronteira), 08 (N+1 — a mais densa), 12 (transações — comportamento + tripla referência), 14 (caching — os três níveis) e 17 (capstone).
Fontes oficiais (base):
- Spring Data JPA reference:
https://docs.spring.io/spring-data/jpa/reference/ - Spring Data JPA — repositories/query methods:
https://docs.spring.io/spring-data/jpa/reference/repositories/query-methods-details.html - Spring Data JPA —
@Query:https://docs.spring.io/spring-data/jpa/reference/jpa/query-methods.html - Spring Data JPA — projections:
https://docs.spring.io/spring-data/jpa/reference/repositories/projections.html - Spring Data JPA — Specifications:
https://docs.spring.io/spring-data/jpa/reference/jpa/specifications.html - Spring Data JPA — paging:
https://docs.spring.io/spring-data/jpa/reference/repositories/core-concepts.html - Hibernate ORM User Guide:
https://docs.jboss.org/hibernate/orm/current/userguide/html_single/Hibernate_User_Guide.html - Jakarta Persistence spec:
https://jakarta.ee/specifications/persistence/ - Spring transaction management:
https://docs.spring.io/spring-framework/reference/data-access/transaction/declarative.html - Spring cache abstraction:
https://docs.spring.io/spring-framework/reference/integration/cache.html - Flyway:
https://documentation.red-gate.com/fd - Liquibase:
https://docs.liquibase.com
Task 0: Pré-flight — pasta, terreno e baselines
Files:
-
Create:
03-Dominios/Java/Persistência de dados/(pasta) -
Step 1: Confirmar
main
git branch --show-currentExpected: main. NÃO criar branch.
- Step 2: Criar a pasta do galho
mkdir -p "03-Dominios/Java/Persistência de dados"- Step 3: Confirmar títulos exatos das notas dos Galhos 7/8/9 (linkadas de volta)
ls "03-Dominios/Java/Jakarta EE/" | grep -E "^(09|10|11) "
ls "03-Dominios/Java/Spring Core e Boot/" | grep -E "^(09|10) "
ls "03-Dominios/Java/Web e APIs REST/" | grep -E "^(05|08) "Expected: G7 — 09 - JPA — a especificação de persistência, 10 - EntityManager e o ciclo de vida da entidade, 11 - JTA — transações na plataforma; G8 — 09 - AOP e proxies no Spring, 10 - Self-invocation e os limites do proxy; G9 — 05 - Serialização JSON com Jackson, 08 - Validação na borda. Anotar divergências.
- Step 4: Relocalizar a dívida reversa (11 ponteiros inline + 3 parágrafos — linhas podem ter mudado)
grep -rn "Galho 10\|galho 10" "03-Dominios/Java/Jakarta EE/09 - JPA — a especificação de persistência.md" "03-Dominios/Java/Jakarta EE/10 - EntityManager e o ciclo de vida da entidade.md" "03-Dominios/Java/Jakarta EE/11 - JTA — transações na plataforma.md" "03-Dominios/Java/Jakarta EE/index.md" "03-Dominios/Java/Spring Core e Boot/index.md" "03-Dominios/Java/Web e APIs REST/05 - Serialização JSON com Jackson.md" "03-Dominios/Java/Web e APIs REST/08 - Validação na borda.md" "03-Dominios/Java/Web e APIs REST/index.md"
grep -n "Galho 10\|planejado" "03-Dominios/Java/Backend/Spring Boot.md"Expected (anotar linhas reais pra Task 23): Jakarta 09 :~57/152/333; Jakarta 10 :~160/331; JTA 11 :~35; Jakarta index :~30; Spring Core index :~32 (parágrafo) e :~97 (horizonte-list — NÃO tocar); Web 05 :~133/378; Web 08 :~236; Web index :~32 (parágrafo) e :~95 (horizonte-list — NÃO tocar); Spring Boot :~63 (callout AOP).
- Step 5: Baseline do Dicionário
grep -cE "^### " "03-Dominios/Java/Dicionário de Java.md"Expected: 272 (baseline pós-Galho 9). Anotar o número real.
- Step 6: Mapear os DOIS troncos (pras Tasks 21/22) e confirmar a fabricação
grep -nE "^#{2,3} " "03-Dominios/Java/Backend/Spring Data JPA.md"
grep -nE "^#{2,3} " "03-Dominios/Java/Backend/Spring Boot.md"
grep -niE "Patient|Doctor|Appointment|Josenaldo|MedEspecialista|minha experiência" "03-Dominios/Java/Backend/Spring Data JPA.md" | head -30
grep -niE "Patient|Doctor|Appointment" "03-Dominios/Java/Backend/Spring Boot.md"Expected: Spring Data JPA.md (~1313 linhas) cobre todo o escopo do galho — poda INTEGRAL na Task 21 (vira hub). Confirmar fabricação espalhada (Patient/Doctor/Appointment, ## Na prática (da minha experiência), ## How to explain in English, “incidente memorável”) — some toda com a poda. No Spring Boot.md: confirmar ## Gerenciamento de transações — @Transactional deep dive ~67-219 (a única seção core deste galho — subseções O básico/Propagation/Isolation/Rollback/Read-only/Timeout/Padrão Service) com Patient pontual ~175 (some com a poda cirúrgica na Task 22). INTOCÁVEIS no Spring Boot.md: callouts dos Galhos 8/9 (## O que é/IoC/AOP/Config/Actuator/## Spring MVC pipeline), ## Spring WebFlux/## Spring Cloud/## Camadas típicas (incl. ### Persistência ~383 e ### Bean Validation ~428 — deixar intactos)/## Troubleshooting. Anotar ranges reais.
-
Step 7: Fixar fatos a verificar via WebFetch — versão atual do Hibernate ORM (baseline 6.x) e do Spring Data JPA; Jakarta Persistence 3.2 (EE 11 — cravado no Galho 7);
@GeneratedValuestrategies (UUID na JPA 3.1); semântica de@Transactional(readOnly); Flyway vs Liquibase atuais; Boot 3.x baseline (Java 17,jakarta.persistence.*). Nada de memória. -
Step 8: Sem commit (preparação).
Fase INICIADO (notas 01-05)
Task 1: Nota 01 — O que é a camada de persistência — Spring Data, JPA e Hibernate ⟦opus⟧
Files:
-
Create:
03-Dominios/Java/Persistência de dados/01 - O que é a camada de persistência — Spring Data, JPA e Hibernate.md -
Step 1: Pesquisar — WebFetch
https://docs.spring.io/spring-data/jpa/reference/+https://hibernate.org/orm/. CONFIRMAR: a pilha (seu código → Spring Data JPA → spec JPA → Hibernate → JDBC → banco); JPA = spec (Galho 7), Hibernate = implementação, Spring Data = elimina boilerplate; versão atual do Hibernate ORM (baseline 6.x) e do Spring Data JPA. Refinar a abertura do troncoSpring Data JPA.md(## O que é), higienizando. -
Step 2: Escrever —
fase: iniciado, tags[java, persistencia, iniciado, jpa], aliases["camada de persistência", "Spring Data JPA", "ORM em Java"]. Nota-assinatura da TRIPLA fronteira. Conteúdo:- TL;DR: a persistência na stack Spring é uma pilha de camadas — Spring Data elimina o boilerplate do repositório sobre a spec JPA (Galho 7), que o Hibernate implementa; o
@Transactionalroda sobre o proxy AOP do Galho 8 e a borda recebe DTO (Galho 9), não a entidade. ## O que é— a pilha em camadas (diagrama ```text: seu código → Spring Data JPA → JPA spec → Hibernate → JDBC → banco) e o que cada uma resolve.## Por que importa— é a camada de dados de quase todo backend Spring; entrevista cobra “spec vs implementação” e “o que o Spring Data esconde”.## Como funciona— H3s: “JPA: a especificação (Galho 7) — o contrato@Entity/@Id”, “Hibernate: a implementação (o que você usa 99% do tempo quando diz ‘JPA’)”, “Spring Data JPA: a camada que elimina o boilerplate do repositório”, “A tripla fronteira: a spec (Galho 7), o mecanismo do@Transactional(Galho 8), a borda/DTO (Galho 9)“.## Na prática— umOrderRepository extends JpaRepository<Order, Long>mínimo + a entidadeOrdermínima (java); `pom.xml` com `spring-boot-starter-data-jpa` (xml).## Armadilhas— ≥2: (1) dizer “JPA é o Hibernate” (spec ≠ implementação — linka G7 nota 09); (2) achar que “Spring Data É a JPA” (é uma camada acima).## Em entrevista+## Veja também(03 - O persistence context e os estados da entidade, 04 - Spring Data repositories — JpaRepository e query methods derivados, JPA (a spec), AOP e proxies (o mecanismo do@Transactional), Serialização JSON (DTO na borda), MOC galho, MOC central, verbetesSpring Data JPA/Hibernate) +## Referências.
- TL;DR: a persistência na stack Spring é uma pilha de camadas — Spring Data elimina o boilerplate do repositório sobre a spec JPA (Galho 7), que o Hibernate implementa; o
-
Step 3: Verificar
grep -cE "^## (O que é|Por que importa|Como funciona|Na prática|Armadilhas|Em entrevista|Veja também|Referências)" "03-Dominios/Java/Persistência de dados/01 - O que é a camada de persistência — Spring Data, JPA e Hibernate.md"
grep -riE "Patient|Doctor|Appointment|MedEspecialista|minha experiência" "03-Dominios/Java/Persistência de dados/01 - O que é a camada de persistência — Spring Data, JPA e Hibernate.md"
grep -c "Jakarta EE/09 - JPA" "03-Dominios/Java/Persistência de dados/01 - O que é a camada de persistência — Spring Data, JPA e Hibernate.md"Expected: ≥7 seções; segundo grep VAZIO; terceiro ≥1 (link de volta ao Galho 7).
- Step 4: Commit —
git add "<path>"&&git commit -m "feat(java): galho 10 nota 01 — O que é a camada de persistência (Spring Data, JPA, Hibernate)"
Task 2: Nota 02 — A entidade JPA — @Entity, @Id e geração de chave
Files:
-
Create:
03-Dominios/Java/Persistência de dados/02 - A entidade JPA — @Entity, @Id e geração de chave.md -
Step 1: Pesquisar — WebFetch
https://jakarta.ee/specifications/persistence/+ Hibernate User Guide (seção identifiers). CONFIRMAR:@Entity/@Table/@Column/@Id/@GeneratedValue; estratégias IDENTITY/SEQUENCE/TABLE/AUTO/UUID (JPA 3.1);@SequenceGenerator/allocationSize; construtor sem-arg. Version-specific (WebFetch obrigatório). -
Step 2: Escrever —
fase: iniciado, tags[java, persistencia, iniciado, entidade, jpa]. Conteúdo:- TL;DR: uma classe vira tabela com
@Entity+@Id;@GeneratedValuedefine como a PK é gerada (SEQUENCE como default recomendado, IDENTITY impede batch); a entidade exige construtor sem-arg eequals/hashCodepor business key. - H3s: “
@Entity/@Table/@Column: o mapeamento básico”, “@Ide@GeneratedValue(IDENTITY/SEQUENCE/TABLE/AUTO/UUID — quando usar cada; UUID na JPA 3.1)”, “equals/hashCodepor business key (nunca@Datado Lombok; id gerado é null antes do save)”, “Por que record não serve como entidade”. ## Na prática— entidadeOrdercom@Id @GeneratedValue(strategy = SEQUENCE)+equals/hashCodeporexternalIdUUID (```java).## Armadilhas— ≥2: (1)@Datado Lombok em entidade (quebra equals/toString com lazy); (2)equalspor id gerado (null antes do save → dois objetos diferentes dãotrue); (3)IDENTITYem workload write-heavy (impede batch — use SEQUENCE).## Veja também— 01 - O que é a camada de persistência — Spring Data, JPA e Hibernate, 03 - O persistence context e os estados da entidade, JPA (a spec define as anotações), Annotations (a mecânica), verbetes@GeneratedValue.
- TL;DR: uma classe vira tabela com
-
Step 3: Verificar — ≥7 seções; anti-fabricação VAZIO; link Galho 7 nota 09 presente;
grep -i "3.1"≥1 (UUID). -
Step 4: Commit —
git commit -m "feat(java): galho 10 nota 02 — a entidade JPA (@Entity, @Id, @GeneratedValue)"
Task 3: Nota 03 — O persistence context e os estados da entidade
Files:
-
Create:
03-Dominios/Java/Persistência de dados/03 - O persistence context e os estados da entidade.md -
Step 1: Pesquisar — WebFetch Hibernate User Guide (persistence context / flushing / dirty checking) +
https://docs.spring.io/spring-data/jpa/reference/. CONFIRMAR: os 4 estados (transient/managed/detached/removed); persistence context = cache de 1º nível (identidade); dirty checking;savedo Spring Data = persist|merge; flush. Refinar do tronco## EntityManager e Session(Persistence Context, Flush, Dirty checking, save/merge), higienizando. -
Step 2: Escrever —
fase: iniciado, tags[java, persistencia, iniciado, jpa, hibernate]. Conteúdo:- TL;DR: o persistence context é um cache de 1º nível por transação — entidades managed têm identidade (mesma query 2x = 1 SQL) e dirty checking (mudou um setter → UPDATE no commit, sem
save()). - H3s: “Os 4 estados (transient → managed → detached → removed) e as transições”, “Persistence context = cache de 1º nível (identidade:
p1 == p2)”, “Dirty checking: por que você não chamasave()em entidade managed”, “savedo Spring Data = persist (id null) ou merge (id existe); flush (commit / antes de query / explícito)“. ## Na prática—@Transactionalcarregando o mesmoOrder2x (1 SQL) + mudando um campo semsave()(dirty checking) (```java).## Armadilhas— ≥2: (1)save()redundante em entidade managed (dirty checking já faz); (2) esperar persistir fora de transação (TransactionRequiredException); (3) acessar lazy em entidade detached (prenúncio da 07).## Veja também— 01 - O que é a camada de persistência — Spring Data, JPA e Hibernate, 07 - Fetch strategies — LAZY, EAGER e a LazyInitializationException, EntityManager e o ciclo de vida da entidade (o conceito, na spec), verbetespersistence context (1º nível)/dirty checking.
- TL;DR: o persistence context é um cache de 1º nível por transação — entidades managed têm identidade (mesma query 2x = 1 SQL) e dirty checking (mudou um setter → UPDATE no commit, sem
-
Step 3: Verificar — ≥7 seções; anti-fabricação VAZIO; link Galho 7 nota 10 presente.
-
Step 4: Commit —
git commit -m "feat(java): galho 10 nota 03 — o persistence context e os estados da entidade"
Task 4: Nota 04 — Spring Data repositories — JpaRepository e query methods derivados
Files:
-
Create:
03-Dominios/Java/Persistência de dados/04 - Spring Data repositories — JpaRepository e query methods derivados.md -
Step 1: Pesquisar — WebFetch
https://docs.spring.io/spring-data/jpa/reference/repositories/query-methods-details.html+.../repositories/core-concepts.html. CONFIRMAR: hierarquiaRepository→CrudRepository→PagingAndSortingRepository→JpaRepository; derived queries e keywords; o repositório é um proxy gerado. -
Step 2: Escrever —
fase: iniciado, tags[java, persistencia, iniciado, spring-data]. Conteúdo:- TL;DR: você declara uma interface
extends JpaRepository<T, ID>e o Spring Data gera a implementação (CRUD herdado + queries derivadas do nome do método). - H3s: “A hierarquia (
Repository→CrudRepository→PagingAndSortingRepository→JpaRepository)”, “CRUD herdado (save/findById/findAll/delete/count/existsById)”, “Derived queries: o SQL gerado do nome do método (keywordsAnd/Or/Between/GreaterThan/OrderBy/In/Containing)”, “Quando a derived query fica ilegível →@Query(nota 09)“. ## Na prática—OrderRepositorycomfindByCustomerEmail,findByStatusAndTotalGreaterThan,countByStatus,existsByExternalId(```java).## Armadilhas— ≥2: (1) derived query gigante e ilegível (findByAAndBOrCOrderByD...→ use@Query); (2)findByIdquando bastavaexistsById(mais rápido); (3) assumir que todo método derivado é eficiente.## Veja também— 01 - O que é a camada de persistência — Spring Data, JPA e Hibernate, 09 - Consultas com @Query — JPQL, native e @Modifying, AOP e proxies (o repositório é um proxy/bean gerado), verbetesJpaRepository/derived query method.
- TL;DR: você declara uma interface
-
Step 3: Verificar — ≥7 seções; anti-fabricação VAZIO; link Galho 8 presente.
-
Step 4: Commit —
git commit -m "feat(java): galho 10 nota 04 — Spring Data repositories e query methods derivados"
Task 5: Nota 05 — Relacionamentos — @ManyToOne, @OneToMany e o owning side
Files:
-
Create:
03-Dominios/Java/Persistência de dados/05 - Relacionamentos — @ManyToOne, @OneToMany e o owning side.md -
Step 1: Pesquisar — WebFetch Hibernate User Guide (associations) +
https://jakarta.ee/specifications/persistence/. CONFIRMAR:@ManyToOne(owning, tem a FK) vs@OneToMany(mappedBy)(inverse);@JoinColumn; defaults de fetch (@ManyToOne/@OneToOneEAGER,@OneToMany/@ManyToManyLAZY). Refinar do tronco## Relacionamentos(@OneToMany/@ManyToOne), higienizando (Doctor/Appointment→Customer/Order). -
Step 2: Escrever —
fase: iniciado, tags[java, persistencia, iniciado, relacionamentos]. Conteúdo:- TL;DR: o par
@ManyToOne/@OneToManymodela um-para-muitos; o owning side (@ManyToOne, com a FK) controla a relação, o inverse (mappedBy) só espelha; helper methods mantêm os dois lados sincronizados. - H3s: “Owning side (
@ManyToOne, tem a FK) vs inverse side (mappedBy)”, “@JoinColumne o lado dono”, “Bidirecional + helper methods (addOrder/removeOrder)”, “Os defaults de fetch (@ManyToOneEAGER — a armadilha que a nota 07 ataca)“. ## Na prática—Customer(@OneToMany(mappedBy="customer")) eOrder(@ManyToOne(fetch=LAZY) @JoinColumn) + helper methods (```java).## Armadilhas— ≥2: (1) esquecermappedBy(duas FKs / join table inesperada); (2) não sincronizar os dois lados (estado inconsistente em memória); (3) confiar no default EAGER do@ManyToOne.## Veja também— 06 - @ManyToMany, @OneToOne, cascade e orphanRemoval, 07 - Fetch strategies — LAZY, EAGER e a LazyInitializationException, JPA (os defaults de fetch são da spec), verbetes@ManyToOne / @OneToMany/owning side / inverse side.
- TL;DR: o par
-
Step 3: Verificar — ≥7 seções; anti-fabricação VAZIO (sem
Doctor/Appointment); link Galho 7 presente. -
Step 4: Commit —
git commit -m "feat(java): galho 10 nota 05 — relacionamentos (@ManyToOne, @OneToMany, owning side)"
Fase ADEPTO (notas 06-11)
Task 6: Nota 06 — @ManyToMany, @OneToOne, cascade e orphanRemoval
Files:
-
Create:
03-Dominios/Java/Persistência de dados/06 - @ManyToMany, @OneToOne, cascade e orphanRemoval.md -
Step 1: Pesquisar — WebFetch Hibernate User Guide (associations, cascading). CONFIRMAR:
@ManyToMany+@JoinTable; entidade associativa explícita;@OneToOne(lazy problemático sem@MapsId); tipos decascade(PERSIST/MERGE/REMOVE/REFRESH/DETACH/ALL) eorphanRemoval. Refinar do tronco (@ManyToMany,@OneToOne), higienizando. -
Step 2: Escrever —
fase: adepto, tags[java, persistencia, adepto, relacionamentos]. ≥3 H3s: “@ManyToMany+@JoinTable(e por que preferir entidade associativa quando a relação tem atributos)”, “@OneToOne(e o lazy problemático sem@MapsId)”, “cascade(PERSIST/MERGE/REMOVE/ALL): propagando operações pai→filho”, “orphanRemoval: a diferença pracascade = REMOVE”.## Na prática:@ManyToManyProduct↔Tag + a versão com entidade associativaOrderItem(```java).## Armadilhas≥3:@ManyToManyescondendo entidade que merecia existir (quando precisa de quantidade/data);cascade = ALLdeletando filhos sem querer;@OneToOneEAGER dobrando JOINs.## Veja também— 05 - Relacionamentos — @ManyToOne, @OneToMany e o owning side, 07 - Fetch strategies — LAZY, EAGER e a LazyInitializationException, verbetes@ManyToMany/@OneToOne/cascade / orphanRemoval. -
Step 3: Verificar — ≥7 seções; ≥3 armadilhas; anti-fabricação VAZIO.
-
Step 4: Commit —
git commit -m "feat(java): galho 10 nota 06 — @ManyToMany, @OneToOne, cascade e orphanRemoval"
Task 7: Nota 07 — Fetch strategies — LAZY, EAGER e a LazyInitializationException
Files:
-
Create:
03-Dominios/Java/Persistência de dados/07 - Fetch strategies — LAZY, EAGER e a LazyInitializationException.md -
Step 1: Pesquisar — WebFetch Hibernate User Guide (fetching) +
https://docs.spring.io/spring-boot/(open-in-view). CONFIRMAR: LAZY vs EAGER (proxy/coleção lazy); regra prática sempre LAZY;LazyInitializationException(acesso fora da tx); OSIV (spring.jpa.open-in-view, defaulttrueno Boot). Refinar do tronco## Fetch strategies(LAZY vs EAGER) +### LazyInitializationException+### Open Session In View, higienizando. -
Step 2: Escrever —
fase: adepto, tags[java, persistencia, adepto, fetch]. ≥3 H3s: “LAZY vs EAGER (proxy / coleção lazy) e a tabela de defaults”, “A regra prática: sempre LAZY (o@ManyToOneEAGER é o vilão escondido)”, “LazyInitializationException: acesso lazy fora da transação (e as soluções de borda)”, “Open Session In View: o Boot habilita por default —open-in-view: falseem produção e por quê”. A entidade que vaza no JSON → DTO linka G9 nota 05.## Na prática:@ManyToOne(fetch=LAZY)+ a exceção ao acessar a coleção fora da tx + o fix (DTO/@EntityGraph) (```java).## Armadilhas≥3:@ManyToOneEAGER (5 JOINs em toda query); OSIV escondendo N+1;@Transactionalno controller só pra evitar a exceção (acopla camadas).## Veja também— 05 - Relacionamentos — @ManyToOne, @OneToMany e o owning side, 08 - O problema N+1 e suas soluções — @EntityGraph, JOIN FETCH, batch size, Serialização JSON (DTO na borda), verbetesfetch strategy (LAZY/EAGER)/LazyInitializationException/Open Session In View (OSIV). -
Step 3: Verificar — ≥7 seções; ≥3 armadilhas; link Galho 9 nota 05 presente; anti-fabricação VAZIO.
-
Step 4: Commit —
git commit -m "feat(java): galho 10 nota 07 — fetch strategies (LAZY, EAGER, LazyInitializationException)"
Task 8: Nota 08 — O problema N+1 e suas soluções — @EntityGraph, JOIN FETCH, batch size ⟦opus⟧
Files:
-
Create:
03-Dominios/Java/Persistência de dados/08 - O problema N+1 e suas soluções — @EntityGraph, JOIN FETCH, batch size.md -
Step 1: Pesquisar — WebFetch Hibernate User Guide (fetching, batch fetching) +
https://docs.spring.io/spring-data/jpa/reference/jpa/entity-graph.html. CONFIRMAR: o N+1 (1 + N queries);@EntityGraph(attributePaths / named);JOIN FETCH(uma coleção/query, cartesian product);@BatchSize; o warningHHH000104(fetch de coleção + paginação → memória). Refinar do tronco### N+1: o bug mais caro+### Soluções para N+1, higienizando. -
Step 2: Escrever —
fase: adepto, tags[java, persistencia, adepto, fetch, n-mais-1]. A nota mais densa do galho. ≥3 H3s: “O que é o N+1 (1 query pai + N filhos ao iterar coleção lazy — exemplo)”, “Detectar: SQL logging,generate_statistics, contador de query no teste”, “Soluções:@EntityGraph(declarativo, preferido),JOIN FETCH(uma coleção/query — o cartesian product com 2+),@BatchSize, DTO projection”, “O cuidadoJOIN FETCH+ paginação (HHH000104— pagina em memória; use DTO/subquery)“.## Na prática: o loop que causa N+1 + as 3 soluções lado a lado (@EntityGraph,JOIN FETCH, projection) (java) + config de SQL logging (yaml).## Armadilhas≥3: N+1 silencioso escondido por OSIV;JOIN FETCHde duas coleções (produto cartesiano); paginar com fetch de coleção (HHH000104).## Veja também— 07 - Fetch strategies — LAZY, EAGER e a LazyInitializationException, 10 - Projections e DTOs — não vazar a entidade, 11 - Paginação e ordenação — Pageable, Page e Slice, verbetesN+1 (problema)/@EntityGraph/@BatchSize. (Sem estatística de adoção inventada.) -
Step 3: Verificar — ≥7 seções; ≥3 armadilhas;
grep -i "HHH000104\|EntityGraph"≥1; anti-fabricação VAZIO. -
Step 4: Commit —
git commit -m "feat(java): galho 10 nota 08 — o problema N+1 e suas soluções"
Task 9: Nota 09 — Consultas com @Query — JPQL, native e @Modifying
Files:
-
Create:
03-Dominios/Java/Persistência de dados/09 - Consultas com @Query — JPQL, native e @Modifying.md -
Step 1: Pesquisar — WebFetch
https://docs.spring.io/spring-data/jpa/reference/jpa/query-methods.html. CONFIRMAR:@QueryJPQL vsnativeQuery = true;@Param;@Modifying(UPDATE/DELETE em massa,clearAutomatically/flushAutomatically). Refinar do tronco### @Query — JPQL e native+### Modifying queries, higienizando. -
Step 2: Escrever —
fase: adepto, tags[java, persistencia, adepto, spring-data, jpql]. ≥3 H3s: “JPQL: consulta entidades/atributos, não tabelas/colunas”, “SQL nativo (nativeQuery = true): quando o JPQL não basta”, “@Modifying: UPDATE/DELETE em massa (e oclearAutomatically/flushAutomaticallyque invalida o L1)“.## Na prática:@Query("SELECT o FROM Order o WHERE ...")+ um native + um@ModifyingUPDATE retornando linhas afetadas (```java).## Armadilhas≥3:@Modifyingsem limpar o L1 (entidade stale na sessão); misturar JPQL e SQL sem perceber (nome de entidade vs tabela);LIKE '%x%'sem índice (full scan).## Veja também— 04 - Spring Data repositories — JpaRepository e query methods derivados, 10 - Projections e DTOs — não vazar a entidade, 15 - Consultas dinâmicas e os limites da JPA — Specifications, Criteria e SQL, verbetes@Query (JPQL/native)/@Modifying. -
Step 3: Verificar — ≥7 seções; ≥3 armadilhas; anti-fabricação VAZIO.
-
Step 4: Commit —
git commit -m "feat(java): galho 10 nota 09 — consultas com @Query (JPQL, native, @Modifying)"
Task 10: Nota 10 — Projections e DTOs — não vazar a entidade
Files:
-
Create:
03-Dominios/Java/Persistência de dados/10 - Projections e DTOs — não vazar a entidade.md -
Step 1: Pesquisar — WebFetch
https://docs.spring.io/spring-data/jpa/reference/repositories/projections.html. CONFIRMAR: interface projection (proxy), class-based/DTO (recordviaSELECT new), dynamic projection (<T> ...(Class<T>)). -
Step 2: Escrever —
fase: adepto, tags[java, persistencia, adepto, projection, spring-data]. ≥3 H3s: “Interface projection (o proxy do Spring; closed vs open)”, “Class-based / DTO projection (recordviaSELECT new com.app.OrderDto(...))”, “Dynamic projection (<T> List<T> findBy...(Class<T>))”, “Quando projection (listagem read-only) vs entidade (modificar)“. Não vazar a entidade na borda linka G9 nota 05 (o DTO é o contrato da API).## Na prática: a entidadeOrder, uma interfaceOrderSummary, umrecord OrderDtovia JPQLSELECT new(```java).## Armadilhas≥3: carregar a entidade inteira só pra ler 3 campos; projection com relação lazy (N+1 sutil); expor a entidade direto no JSON (→ borda é DTO, Galho 9).## Veja também— 08 - O problema N+1 e suas soluções — @EntityGraph, JOIN FETCH, batch size, 09 - Consultas com @Query — JPQL, native e @Modifying, Serialização JSON (DTO na borda), verbeteprojection (JPA). -
Step 3: Verificar — ≥7 seções; ≥3 armadilhas; link Galho 9 nota 05 presente; anti-fabricação VAZIO.
-
Step 4: Commit —
git commit -m "feat(java): galho 10 nota 10 — projections e DTOs (não vazar a entidade)"
Task 11: Nota 11 — Paginação e ordenação — Pageable, Page e Slice
Files:
-
Create:
03-Dominios/Java/Persistência de dados/11 - Paginação e ordenação — Pageable, Page e Slice.md -
Step 1: Pesquisar — WebFetch
https://docs.spring.io/spring-data/jpa/reference/repositories/core-concepts.html(paging and sorting). CONFIRMAR:Pageable/PageRequest;Page(count total — query extra) vsSlice(só há-próxima, sem count);Sort. -
Step 2: Escrever —
fase: adepto, tags[java, persistencia, adepto, paginacao, spring-data]. ≥3 H3s: “Pageable/PageRequesteSort”, “Page<T>: traz o total (uma querycounta mais)”, “Slice<T>: só sabe se há próxima página (sem count — mais barato)”, “O custo do count em tabela grande”.## Na prática:Page<OrderDto> findByStatus(Status s, Pageable p)+PageRequest.of(0, 20, Sort.by("createdAt").descending())(```java).## Armadilhas≥3: usarPagequando não precisa do total (paga o count à toa — useSlice);Sortpor campo não indexado; offset alto em tabela grande (deep pagination — cursor-based é melhor, → API Design).## Veja também— 08 - O problema N+1 e suas soluções — @EntityGraph, JOIN FETCH, batch size, 04 - Spring Data repositories — JpaRepository e query methods derivados, API Design (cursor-based), verbetePageable / Page / Slice. -
Step 3: Verificar — ≥7 seções; ≥3 armadilhas; anti-fabricação VAZIO.
-
Step 4: Commit —
git commit -m "feat(java): galho 10 nota 11 — paginação e ordenação (Pageable, Page, Slice)"
Fase MAGUS (notas 12-17)
Task 12: Nota 12 — Transações operacionais — @Transactional propagação, isolamento, rollback, readOnly ⟦opus⟧
Files:
-
Create:
03-Dominios/Java/Persistência de dados/12 - Transações operacionais — @Transactional propagação, isolamento, rollback, readOnly.md -
Step 1: Pesquisar — WebFetch
https://docs.spring.io/spring-framework/reference/data-access/transaction/declarative.html(+.../transaction/declarative/annotations.html). CONFIRMAR: propagação (REQUIRED/REQUIRES_NEW/NESTED/MANDATORY/SUPPORTS/NOT_SUPPORTED/NEVER); isolamento; rollback rules (só unchecked + Error por default;rollbackFor);readOnly; timeout. Refinar a seção## Gerenciamento de transaçõesdoSpring Boot.md(O básico/Propagation/Isolation/Rollback/Read-only/Timeout/Padrão Service), higienizando (Patient→Order). -
Step 2: Escrever —
fase: magus, tags[java, persistencia, magus, transacao]. Cobre o COMPORTAMENTO, não o mecanismo. ≥3 H3s: “Propagação (REQUIRED default; REQUIRES_NEW pra auditoria que commita independente; NESTED/savepoint; MANDATORY/NEVER)”, “Isolamento (READ_COMMITTED default PG / REPEATABLE_READ default MySQL / SERIALIZABLE — teoria em Banco de dados)”, “Rollback rules (sóRuntimeException/Errorpor default — checked NÃO faz rollback;rollbackFor;setRollbackOnly)”, “readOnly(desabilita dirty checking), timeout, transação na camada Service”. O mecanismo é o proxy AOP → linka G8 notas 09/10 (AOP + self-invocation); a demarcação é a JTA → linka G7 nota 11.## Na prática:@Service @Transactional(readOnly=true)na classe, método de escrita sobrescrevendo com@Transactional+REQUIRES_NEWpra auditoria (```java).## Armadilhas≥3: checked exception não faz rollback (default — exemplo +rollbackFor); self-invocation (chamada interna não passa pelo proxy — linka G8 nota 10);@Transactionalem métodoprivate.## Veja também— 03 - O persistence context e os estados da entidade, 13 - Locking — optimistic (@Version) e pessimistic, AOP e proxies (o mecanismo), Self-invocation e os limites do proxy, JTA (a demarcação, na spec), Banco de dados, verbetes@Transactional (propagação)/propagação de transação/isolamento (isolation level)/rollback rules/readOnly (transação). -
Step 3: Verificar — ≥7 seções; ≥3 armadilhas; links Galho 8 (AOP 09 + Self-invocation 10) e Galho 7 (JTA 11) presentes; grep
PatientVAZIO (higienizado); anti-fabricação VAZIO. -
Step 4: Commit —
git commit -m "feat(java): galho 10 nota 12 — transações operacionais (@Transactional)"
Task 13: Nota 13 — Locking — optimistic (@Version) e pessimistic
Files:
-
Create:
03-Dominios/Java/Persistência de dados/13 - Locking — optimistic (@Version) e pessimistic.md -
Step 1: Pesquisar — WebFetch Hibernate User Guide (locking) +
https://jakarta.ee/specifications/persistence/(LockModeType). CONFIRMAR:@Version(optimistic,OptimisticLockException);@Lock(PESSIMISTIC_WRITE)/SELECT ... FOR UPDATE; deadlock e ordem de aquisição. Refinar do tronco### Optimistic locking — @Version+### Pessimistic locking, higienizando (Account/transferência é neutro — pode manter). -
Step 2: Escrever —
fase: magus, tags[java, persistencia, magus, locking, transacao]. ≥3 H3s: “Lost update: o problema que o locking resolve”, “Optimistic (@Version,OptimisticLockException, retry — pra conflito raro)”, “Pessimistic (@Lock(PESSIMISTIC_WRITE),SELECT ... FOR UPDATE, deadlock e ordem de aquisição — pra conflito frequente)”, “Quando cada um”. Liga a Concorrência (conflito de escrita).## Na prática:@Versionnuma entidadeAccount+ o retry noOptimisticLockException+ umfindByIdForUpdatecom@Lock(```java).## Armadilhas≥3: esquecer@Versionem entidade editável concorrentemente (lost update silencioso); deadlock por ordem de lock inconsistente (adquira por ordem crescente de id); pessimistic onde optimistic bastava (contenção desnecessária).## Veja também— 12 - Transações operacionais — @Transactional propagação, isolamento, rollback, readOnly, Concorrência e paralelismo, Banco de dados, verbetes@Version (optimistic locking)/pessimistic locking. -
Step 3: Verificar — ≥7 seções; ≥3 armadilhas; anti-fabricação VAZIO.
-
Step 4: Commit —
git commit -m "feat(java): galho 10 nota 13 — locking (optimistic e pessimistic)"
Task 14: Nota 14 — Caching — 1º nível, 2º nível e Spring Cache ⟦opus⟧
Files:
-
Create:
03-Dominios/Java/Persistência de dados/14 - Caching — 1º nível, 2º nível e Spring Cache.md -
Step 1: Pesquisar — WebFetch Hibernate User Guide (caching) +
https://docs.spring.io/spring-framework/reference/integration/cache.html. CONFIRMAR: L1 (persistence context, por-tx); L2 (@Cacheable/@Cache, estratégias READ_ONLY/NONSTRICT_READ_WRITE/READ_WRITE/TRANSACTIONAL, region factory); Spring Cache (@Cacheable/@CacheEvict/@CachePut, Caffeine/Redis). Refinar do tronco## Caching(1st/2nd level + Spring Cache), higienizando. -
Step 2: Escrever —
fase: magus, tags[java, persistencia, magus, cache]. ≥3 H3s: “1º nível (persistence context — por transação; recapitula a nota 03)”, “2º nível (application-wide,@Cacheable/@Cache, estratégias; quando usar — entidade de referência lida-muito/mudada-pouco; quando NÃO — dinâmico, multi-nó sem cache distribuído)”, “Spring Cache (@Cacheable/@CacheEvict/@CachePutna camada Service — a camada acima da JPA)“. Distingue os três níveis.## Na prática:@Entity @Cacheable @Cache(usage = READ_WRITE)numaCountryde referência +@Cacheable("countries")num service (java) + config (yaml).## Armadilhas≥3: confundir L1 (por-tx) com L2 (app-wide); L2 em dado volátil (stale reads);@Cacheablesem@CacheEvict(cache nunca invalida).## Veja também— 03 - O persistence context e os estados da entidade, 12 - Transações operacionais — @Transactional propagação, isolamento, rollback, readOnly, System Design (estratégias de cache), verbetessecond-level cache (2º nível)/@Cacheable / Spring Cache. -
Step 3: Verificar — ≥7 seções; ≥3 armadilhas; anti-fabricação VAZIO.
-
Step 4: Commit —
git commit -m "feat(java): galho 10 nota 14 — caching (1º nível, 2º nível, Spring Cache)"
Task 15: Nota 15 — Consultas dinâmicas e os limites da JPA — Specifications, Criteria e SQL
Files:
-
Create:
03-Dominios/Java/Persistência de dados/15 - Consultas dinâmicas e os limites da JPA — Specifications, Criteria e SQL.md -
Step 1: Pesquisar — WebFetch
https://docs.spring.io/spring-data/jpa/reference/jpa/specifications.html+https://jakarta.ee/specifications/persistence/(Criteria) +https://www.jooq.org/(menção). CONFIRMAR:JpaSpecificationExecutor/Specification; Criteria API (query programática type-safe da spec); JdbcClient/JdbcTemplate/jOOQ como escape hatch. Refinar do tronco### Specifications+## Quando NÃO usar JPA+### jOOQ+### JdbcTemplate / JdbcClient, higienizando. -
Step 2: Escrever —
fase: magus, tags[java, persistencia, magus, spring-data, jpql]. ≥3 H3s: “Specifications: filtros dinâmicos componíveis (JpaSpecificationExecutor,where(...).and(...))”, “Criteria API: a query programática type-safe da spec JPA (Galho 7) sob as Specifications”, “Quando a JPA não basta (analítico, window functions, bulk, reporting)”, “O escape hatch:JdbcClient/JdbcTemplate, jOOQ (type-safe)“. Sem dogma — JPA pro domínio transacional, SQL pro analítico.## Na prática:PatientSpecs→OrderSpecscomhasStatus/totalGreaterThancompostos viawhere().and()+ umJdbcClientsimples (```java).## Armadilhas≥3: forçar JPQL onde SQL/jOOQ era melhor (relatório com window function); Specification ilegível (lógica demais no predicado); achar que JPA serve pra tudo.## Veja também— 09 - Consultas com @Query — JPQL, native e @Modifying, 11 - Paginação e ordenação — Pageable, Page e Slice, JPA (a Criteria API é da spec), Banco de dados, verbetesSpecification (Spring Data)/Criteria API. -
Step 3: Verificar — ≥7 seções; ≥3 armadilhas; anti-fabricação VAZIO (sem
Patient); link Galho 7 presente. -
Step 4: Commit —
git commit -m "feat(java): galho 10 nota 15 — consultas dinâmicas e os limites da JPA"
Task 16: Nota 16 — Migrations de schema — Flyway, Liquibase e expand-and-contract
Files:
-
Create:
03-Dominios/Java/Persistência de dados/16 - Migrations de schema — Flyway, Liquibase e expand-and-contract.md -
Step 1: Pesquisar (CRÍTICO) — WebFetch
https://documentation.red-gate.com/fd(Flyway) +https://docs.liquibase.com. CONFIRMAR: Flyway (V__/R__, SQL versionado) vs Liquibase (changelog XML/YAML/JSON/SQL, rollback declarativo,databasechangelog); versões/integração atuais com Spring Boot; regras de ouro. Version-specific (WebFetch obrigatório; sem estatística de adoção inventada). Refinar do tronco## Flyway: migrations seguras(estrutura, regras de ouro, expand-and-contract), higienizando. -
Step 2: Escrever —
fase: magus, tags[java, persistencia, magus, migrations]. ≥3 H3s: “Por que versionar o schema (não confiar noddl-auto=updateem produção)”, “Flyway (V__/R__, SQL puro) vs Liquibase (changelog declarativo, rollback) — quando cada”, “Regras de ouro (nunca editar migration aplicada, roll-forward, baseline)”, “Expand-and-contract: mudança em tabela grande sem downtime (add nullable → backfill → not null, deploy sequencial); índiceCONCURRENTLY”.## Na prática: estruturadb/migration/V1__...sql(Flyway) + o trio expand/backfill/contract (sql) + config (yaml).## Armadilhas≥3:ddl-auto=updateem produção (drift de schema); editar migration já aplicada (checksum quebra);ALTER TABLE ADD COLUMN NOT NULLtravando tabela grande (use expand-and-contract).## Veja também— 02 - A entidade JPA — @Entity, @Id e geração de chave, Banco de dados, API Design (evolução com deprecation), verbetesFlyway/Liquibase/expand-and-contract. -
Step 3: Verificar — ≥7 seções; ≥3 armadilhas;
grep -i "flyway\|liquibase"≥2; anti-fabricação VAZIO; sem estatística inventada (revisar manualmente). -
Step 4: Commit —
git commit -m "feat(java): galho 10 nota 16 — migrations de schema (Flyway, Liquibase, expand-and-contract)"
Task 17: Nota 17 — Capstone — Uma query do repositório ao banco, sem cair no N+1 ⟦opus⟧
Files:
-
Create:
03-Dominios/Java/Persistência de dados/17 - Capstone — Uma query do repositório ao banco, sem cair no N+1.md -
Step 1: Pesquisar — WebFetch
https://docs.spring.io/spring-data/jpa/reference/(revisão) + Hibernate User Guide (revisão). Conferir a tabela “Galho 10 → spec Jakarta” com as notas dos Galhos 7/8 já escritas. -
Step 2: Escrever —
fase: magus, tags[java, persistencia, magus, spring-data, jpa], aliases["Capstone Persistência", "Query do repositório ao banco"]. Híbrido: trace + checklist de design. Conteúdo:- TL;DR: uma query atravessa repo (proxy Spring Data) → JPQL/Criteria → Hibernate monta o SQL → persistence context → JDBC →
ResultSet→ entidades managed → DTO; projetar a camada é dominar esse caminho sem cair no N+1. ## O que é/## Por que importa.## Como funciona— H3s: “Trace:repo.findAll(spec, pageable)da chamada ao banco e de volta (diagrama ```text: proxy → JPQL/Criteria → SQL → persistence context → JDBC → ResultSet → entidades managed → DTO)”, “O caminho transacional (proxy AOP abre tx → dirty checking → commit)”, “Galho 10 → spec Jakarta (Galho 7) (tabela:@Entity↔JPA, persistence context↔EntityManager,@Transactional↔JTA + proxy AOP do Galho 8)“.## Na prática—### Checklist de design production-grade(sempre LAZY; fetch explícito sem N+1; DTO não-entidade na borda;readOnlydefault no Service;@Versiononde há concorrência; migration expand-and-contract; OSIV desabilitado).## Armadilhas(de raciocínio) ≥3: “o repositório vai direto no banco” (há a engrenagem toda no meio); “JPA resolve tudo” (escape hatch — nota 15); “EAGER é mais simples” (N+1).## Em entrevista(munição: a pilha, o N+1, transações) +### Cheatsheet(nota→problema) +## Veja também(notas-chave do galho + JPA + JTA + AOP e proxies + MOC galho/central) +## Referências.
- TL;DR: uma query atravessa repo (proxy Spring Data) → JPQL/Criteria → Hibernate monta o SQL → persistence context → JDBC →
-
Step 3: Verificar — ≥7 seções; tabela “Galho 10 → spec Jakarta” presente (
grep -iE "JPA|EntityManager|JTA"); links Galho 7 + Galho 8 presentes; anti-fabricação VAZIO; sem estatística inventada (revisar manualmente). -
Step 4: Commit —
git commit -m "feat(java): galho 10 nota 17 — capstone (uma query do repositório ao banco)"
Task 18: MOC do galho
Files:
-
Create:
03-Dominios/Java/Persistência de dados/index.md -
Step 1: Escrever — modelar pelo
03-Dominios/Java/Web e APIs REST/index.md. Frontmatter:type: moc,status: growing,publish: true,title: "Persistência de dados", tags[java, persistencia, moc], aliases["Persistência de dados", "JPA", "Hibernate", "Spring Data JPA", "Galho 10 - Persistência"],created/updated: 2026-06-09. Conteúdo:- TL;DR — Galho 10; a camada de dados sobre a spec JPA do Galho 7: entidades e o persistence context, mapeamento de relacionamentos, fetch e o N+1, Spring Data repositories e consultas, paginação, transações operacionais, locking, caching e migrations; 17 notas em 3 fases.
## Sobre este galho— escopo + audiência + galho híbrido (poda integral do troncoSpring Data JPA.md+ poda cirúrgica da seção de transações doSpring Boot.md+ pesquisa pras partes version-specific) + tripla fronteira (operacionaliza specs do Galho 7; usa o mecanismo AOP do@Transactionaldo Galho 8; alimenta a borda do Galho 9; Galhos 11/12/13/16 planejados, texto).## Iniciado(01-05) /## Adepto(06-11) /## Magus(12-17) — wikilinks + 1 linha cada.## Rotas alternativas— 5: Completa (01→17); Entrevista internacional (01→03→05→07→08→12→17); Caçando o N+1 (05→07→08→10→17); Projetando a camada de persistência (02→05→07→10→11→12→16); Persistência sobre Jakarta EE (01→03→12 + Galho 7).## Todas as notas— Dataview (FROM "03-Dominios/Java/Persistência de dados",WHERE type = "concept").## Veja também— MOC central, Jakarta EE (as specs), Spring Core e Boot (o mecanismo AOP), Web e APIs REST (a borda), Banco de dados (teoria SQL/ACID), Dicionário; Galhos 11/12/13/16 como texto “(planejado)” SEM wikilink.
-
Step 2: Verificar
grep -cE "^## (Iniciado|Adepto|Magus|Rotas alternativas)" "03-Dominios/Java/Persistência de dados/index.md"
grep -c "\[\[" "03-Dominios/Java/Persistência de dados/index.md"
grep -E "\[\[[^]]*(Galho (11|12|13|16))" "03-Dominios/Java/Persistência de dados/index.md"Expected: 4 headings; ≥17 wikilinks; último grep VAZIO.
- Step 3: Commit —
git add "<path>"&&git commit -m "feat(java): galho 10 MOC — Persistência de dados"
Task 19: Expandir o Dicionário de Java (NÃO recriar)
Files:
-
Modify:
03-Dominios/Java/Dicionário de Java.md -
Step 1: Extrair as âncoras realmente usadas pelas notas
grep -rhoE "Dicionário de Java#[^]|]+" "03-Dominios/Java/Persistência de dados/" | sort -uA fonte da verdade é o que as notas usaram. Lista esperada (~30): @BatchSize, @Cacheable / Spring Cache, @EntityGraph, @GeneratedValue, @ManyToMany, @ManyToOne / @OneToMany, @Modifying, @OneToOne, @Query (JPQL/native), @Transactional (propagação), @Version (optimistic locking), cascade / orphanRemoval, Criteria API, derived query method, dirty checking, expand-and-contract, fetch strategy (LAZY/EAGER), Flyway, Hibernate, isolamento (isolation level), JpaRepository, LazyInitializationException, Liquibase, N+1 (problema), Open Session In View (OSIV), owning side / inverse side, Pageable / Page / Slice, pessimistic locking, persistence context (1º nível), projection (JPA), propagação de transação, readOnly (transação), rollback rules, Specification (Spring Data), Spring Data JPA, second-level cache (2º nível).
- Step 2: Ler o Dicionário e conferir duplicatas — formato
### Termo+ 1-3 linhas +Veja também:. NÃO recriar/reordenar. Conferir verbetes já existentes (Galhos 7/8) pra NÃO duplicar e linkar entre si:persistence context (1º nível)↔persistence context(conceito, Galho 7);@Transactional (propagação)↔@Transactional(Galho 8 e/ou Jakarta, Galho 7);dirty checking(se já existir do Galho 7) — não duplicar, complementar/linkar;Hibernate/JPA/EntityManager/JTA/JPQL/owning side(Galho 7). Conferir com:
grep -nE "^### (JPA|EntityManager|JTA|JPQL|persistence context|dirty checking|owning side|@Transactional|Hibernate|entidade)" "03-Dominios/Java/Dicionário de Java.md"-
Step 3: Inserir em ordem alfabética (case-insensitive, sem acento; verbetes iniciados em
@entram na seção da letra seguinte — conferir o padrão do arquivo). Cada verbete: heading EXATO da âncora + definição fiel às notas +Veja também:pra nota canônica (Spring Data JPA/Hibernate→01;@GeneratedValue→02; persistence context/dirty checking→03; JpaRepository/derived query→04;@ManyToOne / @OneToMany/owning side→05;@ManyToMany/@OneToOne/cascade→06; fetch strategy/LazyInitializationException/OSIV→07; N+1/@EntityGraph/@BatchSize→08;@Query/@Modifying→09; projection→10;Pageable / Page / Slice→11;@Transactional/propagação/isolamento/rollback/readOnly→12;@Version/pessimistic locking→13; second-level cache/@Cacheable→14; Specification/Criteria API→15; Flyway/Liquibase/expand-and-contract→16). Atualizarupdated: 2026-06-09. -
Step 4: Verificar
grep -E "^### (Spring Data JPA|N\+1|@EntityGraph|Flyway|persistence context|@Transactional)" "03-Dominios/Java/Dicionário de Java.md"
grep -cE "^### " "03-Dominios/Java/Dicionário de Java.md"Expected: novos presentes; contagem subiu ~30 vs baseline (272 → ~300).
- Step 5: Commit —
git add "<path>"&&git commit -m "feat(java): expande Dicionário de Java com verbetes do galho 10 (Persistência de dados)"
Task 20: Ativar o Galho 10 no MOC central
Files:
-
Modify:
03-Dominios/Java/index.md -
Step 1: Trocar a linha do item 10 (localizar por conteúdo:
10. Persistência de dados *(planejado)* — JPA/Hibernate, Spring Data, fetch/N+1, transações, migrations) por:
10. [[03-Dominios/Java/Persistência de dados/index|Persistência de dados]] — JPA/Hibernate, o persistence context, mapeamento e relacionamentos, fetch strategies e o N+1, Spring Data repositories e consultas, paginação, transações operacionais, locking, caching e migrationsAtualizar updated: 2026-06-09. Não mexer no resto.
- Step 2: Verificar
grep -E "Persistência de dados/index" "03-Dominios/Java/index.md"
grep -c "planejado" "03-Dominios/Java/index.md"Expected: wikilink ativo; “planejado” caiu exatamente 1 vs baseline.
- Step 3: Commit —
git add "<path>"&&git commit -m "feat(java): ativa Galho 10 (Persistência de dados) no MOC central"
Task 21: Poda INTEGRAL do tronco (Backend/Spring Data JPA.md)
Files:
-
Modify:
03-Dominios/Java/Backend/Spring Data JPA.md -
Step 1: Ler o tronco e confirmar que o conteúdo bom já migrou pras notas (política §9 do roadmap — ler antes de podar). Conferir que entidade/relacionamentos/fetch/N+1/repositories/queries/projections/transações/locking/caching/migrations já estão cobertos nas notas 01-17. Só podar depois das 17 notas existirem.
-
Step 2: Podar INTEGRAL — substituir TODO o corpo (da linha após o frontmatter até o fim) por um hub enxuto (padrão JavaFX/Galho 6). Manter o frontmatter com
publish: falseeupdated: 2026-06-09. Corpo novo:
# Spring Data JPA
Persistência na stack Spring — JPA/Hibernate, Spring Data repositories, mapeamento e relacionamentos, fetch strategies, o problema N+1, transações, caching e migrations.
> [!nota] Migrado para galho próprio
>
> Expandido no galho [[03-Dominios/Java/Persistência de dados/index|Persistência de dados]]. Veja [[03-Dominios/Java/Persistência de dados/01 - O que é a camada de persistência — Spring Data, JPA e Hibernate|O que é a camada de persistência]], [[03-Dominios/Java/Persistência de dados/03 - O persistence context e os estados da entidade|O persistence context e os estados da entidade]], [[03-Dominios/Java/Persistência de dados/05 - Relacionamentos — @ManyToOne, @OneToMany e o owning side|Relacionamentos]], [[03-Dominios/Java/Persistência de dados/08 - O problema N+1 e suas soluções — @EntityGraph, JOIN FETCH, batch size|O problema N+1]], [[03-Dominios/Java/Persistência de dados/12 - Transações operacionais — @Transactional propagação, isolamento, rollback, readOnly|Transações operacionais]] e [[03-Dominios/Java/Persistência de dados/16 - Migrations de schema — Flyway, Liquibase e expand-and-contract|Migrations de schema]].
## Veja também
- [[03-Dominios/Java/Persistência de dados/index|Persistência de dados (MOC do galho)]]
- [[03-Dominios/Java/index|Trilha Java]]
- [[Banco de dados]]Toda a fabricação some (Patient/Doctor/Appointment, ## Na prática (da minha experiência), ## How to explain in English, “incidente memorável” do MedEspecialista).
- Step 3: Verificar (poda integral — fabricação evaporada, hub presente)
wc -l "03-Dominios/Java/Backend/Spring Data JPA.md"
grep -niE "Patient|Doctor|Appointment|MedEspecialista|minha experiência|incidente" "03-Dominios/Java/Backend/Spring Data JPA.md"
grep -c "Migrado para galho próprio" "03-Dominios/Java/Backend/Spring Data JPA.md"
grep -E "^publish:" "03-Dominios/Java/Backend/Spring Data JPA.md"Expected: arquivo ~20-25 linhas; segundo grep VAZIO (fabricação some); 1 callout “Migrado”; publish: false mantido.
- Step 4: Commit —
git add "03-Dominios/Java/Backend/Spring Data JPA.md"&&git commit -m "refactor(java): poda integral do tronco Spring Data JPA — vira hub do galho 10"
Task 22: Poda CIRÚRGICA do tronco (Backend/Spring Boot.md) — só a seção de transações
Files:
-
Modify:
03-Dominios/Java/Backend/Spring Boot.md -
Step 1: Ler o tronco e confirmar o range (política §9 — ler antes de podar)
grep -nE "^#{2,3} " "03-Dominios/Java/Backend/Spring Boot.md"Confirmar os limites reais de ## Gerenciamento de transações — @Transactional deep dive (início ~67, fim = imediatamente antes da próxima ## — provavelmente ## Spring MVC pipeline callout; conferir na execução). Só esta seção é podada.
- Step 2: Podar
## Gerenciamento de transações— substituir TODO o bloco da seção (do heading até imediatamente antes da próxima##) por:
## Gerenciamento de transações — @Transactional deep dive
> [!nota] Migrado para galho próprio
>
> Expandido no galho [[03-Dominios/Java/Persistência de dados/index|Persistência de dados]]. Veja [[03-Dominios/Java/Persistência de dados/12 - Transações operacionais — @Transactional propagação, isolamento, rollback, readOnly|Transações operacionais (@Transactional)]] e [[03-Dominios/Java/Persistência de dados/13 - Locking — optimistic (@Version) e pessimistic|Locking]]. O mecanismo (proxy AOP, self-invocation) é do galho [[03-Dominios/Java/Spring Core e Boot/index|Spring Core e Boot]].A contaminação Patient (~175) some com a substituição (não copiar pras notas).
-
Step 3: Atualizar
## Veja também+ frontmatter — adicionar wikilink[[03-Dominios/Java/Persistência de dados/index|Persistência de dados]]no “Veja também” do tronco (se já não houver);updated: 2026-06-09. -
Step 4: Verificar (poda cirúrgica — uma seção só; resto intacto)
grep -nE "^## " "03-Dominios/Java/Backend/Spring Boot.md"
grep -c "Persistência de dados/index" "03-Dominios/Java/Backend/Spring Boot.md"
grep -nE "Propagation|Isolation levels|Rollback rules" "03-Dominios/Java/Backend/Spring Boot.md"
grep -nE "^## (Spring MVC pipeline|Spring WebFlux|Spring Cloud|Camadas típicas)" "03-Dominios/Java/Backend/Spring Boot.md"
grep -nE "^### (Persistência|Bean Validation)" "03-Dominios/Java/Backend/Spring Boot.md"Expected: o ## Gerenciamento de transações agora é só callout (segundo grep ≥1 link); subseções de transação (Propagation/Isolation/Rollback) sumiram (terceiro grep VAZIO); callouts dos Galhos 8/9 (## Spring MVC pipeline) e seções de outros galhos (WebFlux/Cloud/Camadas típicas) AINDA PRESENTES; ### Persistência/### Bean Validation sob Camadas típicas intactos (último grep ≥2).
- Step 5: Commit —
git add "03-Dominios/Java/Backend/Spring Boot.md"&&git commit -m "refactor(java): poda cirúrgica do tronco Spring Boot — seção de transações migra pro galho 10"
Task 23: Quitar a dívida reversa (11 ponteiros inline + 3 parágrafos → wikilinks)
Files:
-
Modify:
03-Dominios/Java/Jakarta EE/09 - JPA — a especificação de persistência.md -
Modify:
03-Dominios/Java/Jakarta EE/10 - EntityManager e o ciclo de vida da entidade.md -
Modify:
03-Dominios/Java/Jakarta EE/11 - JTA — transações na plataforma.md -
Modify:
03-Dominios/Java/Jakarta EE/index.md -
Modify:
03-Dominios/Java/Spring Core e Boot/index.md -
Modify:
03-Dominios/Java/Web e APIs REST/05 - Serialização JSON com Jackson.md -
Modify:
03-Dominios/Java/Web e APIs REST/08 - Validação na borda.md -
Modify:
03-Dominios/Java/Web e APIs REST/index.md -
(O
Backend/Spring Boot.md:63já foi quitado na Task 22 — o callout AOP “fica para o Galho 10… na seção de transações abaixo” deve ser ajustado lá; ver Step 2.) -
Step 1: Relocalizar (por conteúdo — linhas podem ter mudado)
grep -rn "Galho 10\|galho 10\|planejado" "03-Dominios/Java/Jakarta EE/09 - JPA — a especificação de persistência.md" "03-Dominios/Java/Jakarta EE/10 - EntityManager e o ciclo de vida da entidade.md" "03-Dominios/Java/Jakarta EE/11 - JTA — transações na plataforma.md" "03-Dominios/Java/Jakarta EE/index.md" "03-Dominios/Java/Spring Core e Boot/index.md" "03-Dominios/Java/Web e APIs REST/05 - Serialização JSON com Jackson.md" "03-Dominios/Java/Web e APIs REST/08 - Validação na borda.md" "03-Dominios/Java/Web e APIs REST/index.md"-
Step 2: Aplicar os wikilinks — em cada ponteiro, trocar o texto “Galho 10 (planejado)”/“Galho 10, planejado” pelo wikilink, mantendo natural a frase e atualizando
updated: 2026-06-09no frontmatter de cada arquivo tocado:- Jakarta EE/09 - JPA (~57): “…O Galho 10 (planejado) constrói em cima…” → “…o Galho 10 constrói em cima…”
- Jakarta EE/09 - JPA (~152): tabela “Tudo que vai além do default — Galho 10 (planejado)” → “…Galho 10”
- Jakarta EE/09 - JPA (~333): comentário HTML “além do contrato é assunto do Galho 10 (planejado).” → wikilink pra nota 07 (ou MOC); se estiver em comentário HTML
<!-- -->, manter o comentário mas trocar o texto pelo wikilink. - Jakarta EE/10 - EntityManager (~160): “…Como o provider detecta as mudanças … território do Galho 10 (planejado).” → “…território do Galho 10.”
- Jakarta EE/10 - EntityManager (~331): “As estratégias concretas de carregamento … Galho 10 (planejado)…” → “…são assunto do Galho 10…”
- Jakarta EE/11 - JTA (~35): “O
@Transactionaldo Spring é assunto dos Galhos 8/10 (planejado)…” → “…dos Galhos 8 (o mecanismo AOP) e 10 (o comportamento)…” (Galho 8 já existe — quitar os dois.) - Jakarta EE/index (~30): “…JPA operacional (Hibernate, fetch/N+1, caching, Spring Data, migrations) é do Galho 10 (planejado)…” → “…é do galho Persistência de dados…”
- Spring Core e Boot/index (~32, parágrafo de fronteira): “…Persistência/transações operacionais com Spring Data, Hibernate, fetch/N+1 e migrations (Galho 10) são planejados…” → “…com Spring Data, Hibernate, fetch/N+1 e migrations é o galho Persistência de dados…” NÃO tocar o horizonte-list :97 (deixar 11/12/13/16 como planejados lá).
- Web e APIs REST/05 - Serialização JSON (~133): “…A camada de persistência … (Galho 10 da trilha Java — persistência com JPA/Hibernate, planejado).” → “…(o galho Persistência de dados).”
- Web e APIs REST/05 - Serialização JSON (~378, Veja também): “Persistência JPA/Hibernate … → Galho 10 (planejado).” → wikilink pra
[[03-Dominios/Java/Persistência de dados/index|Persistência de dados]](ou nota 01). - Web e APIs REST/08 - Validação na borda (~236): “…regras de negócio … pertencem à camada de serviço (Galho 10 — planejado).” → “…pertencem à camada de serviço (ver o galho Persistência de dados).”
- Web e APIs REST/index (~32, parágrafo de fronteira): “…Persistência/Spring Data (Galho 10) … são planejados…” → “…Persistência/Spring Data é o galho Persistência de dados…” NÃO tocar o horizonte-list :95.
-
Step 3: Verificar
grep -rn "Galho 10\|galho 10" "03-Dominios/Java/Jakarta EE/09 - JPA — a especificação de persistência.md" "03-Dominios/Java/Jakarta EE/10 - EntityManager e o ciclo de vida da entidade.md" "03-Dominios/Java/Jakarta EE/11 - JTA — transações na plataforma.md" "03-Dominios/Java/Jakarta EE/index.md" "03-Dominios/Java/Spring Core e Boot/index.md" "03-Dominios/Java/Web e APIs REST/05 - Serialização JSON com Jackson.md" "03-Dominios/Java/Web e APIs REST/08 - Validação na borda.md" "03-Dominios/Java/Web e APIs REST/index.md" | grep -v "Persistência de dados" | grep -vE ":(95|97):" | grep -iE "planejado|10 \(plan"Expected: VAZIO (nenhum “Galho 10 (planejado)” solto sobra fora dos horizonte-lists :95/:97; os “Galho 10” remanescentes devem vir acompanhados do wikilink “Persistência de dados”). Conferir manualmente que os horizonte-lists (Spring Core :97, Web :95) permanecem com 11/12/13/16 como “(planejado)“.
- Step 4: Commit —
git addnominal dos 8 arquivos &&git commit -m "refactor(java): quita dívida reversa do galho 10 — ponteiros de persistência viram wikilinks"
Task 24: Verificação final do galho
Files: (somente leitura/verificação)
- Step 1: 17 notas + MOC
ls "03-Dominios/Java/Persistência de dados/" | sortExpected: 01..17 + index.md (18 arquivos).
- Step 2: Fases (5/6/6)
for f in "03-Dominios/Java/Persistência de dados/"[0-9]*.md; do grep -H "^fase:" "$f"; doneExpected: 01-05 iniciado, 06-11 adepto, 12-17 magus.
- Step 3: Seções obrigatórias (3 por nota)
for f in "03-Dominios/Java/Persistência de dados/"[0-9]*.md; do echo "$f: $(grep -cE '^## (Em entrevista|Armadilhas|Veja também)' "$f")"; doneExpected: 3 em todas.
- Step 4: Anti-fabricação + fronteiras (greps decisivos)
grep -riE "minha experiência|no meu projeto|josenaldo|Patient|Doctor|Appointment|MedEspecialista|market share|% d[ao]s (dev|empresas|projetos)" "03-Dominios/Java/Persistência de dados/"
grep -rE "\[\[[^]]*(Galho (11|12|13|16)|WebFlux|R2DBC|Spring Security|@DataJpaTest|Testcontainers|saga|CQRS|sharding)" "03-Dominios/Java/Persistência de dados/"
grep -rn '\[\[#' "03-Dominios/Java/Persistência de dados/"Expected: todos VAZIOS.
- Step 5: Tripla fronteira-assinatura (links de volta aos Galhos 7, 8 e 9 presentes)
grep -rl "Jakarta EE/(09|10|11)" "03-Dominios/Java/Persistência de dados/" | sort
grep -rl "Spring Core e Boot/(09|10)" "03-Dominios/Java/Persistência de dados/" | sort
grep -rl "Web e APIs REST/05" "03-Dominios/Java/Persistência de dados/" | sortExpected: notas 01/02/03/05/15/17 linkam pra alguma nota do Galho 7 (JPA/EntityManager/JTA); notas 01/04/12 linkam pro Galho 8 (AOP/self-invocation); notas 07/10 linkam pro Galho 9 (Serialização JSON).
- Step 6: Frase pronta (1 por nota)
for f in "03-Dominios/Java/Persistência de dados/"[0-9]*.md; do echo "$f: $(grep -c '### Frase pronta (inglês)' "$f")"; doneExpected: 1 em todas.
- Step 7: Troncos — poda confirmada (integral + cirúrgica)
wc -l "03-Dominios/Java/Backend/Spring Data JPA.md"
grep -c "Migrado para galho próprio" "03-Dominios/Java/Backend/Spring Data JPA.md"
grep -niE "Patient|Doctor|MedEspecialista" "03-Dominios/Java/Backend/Spring Data JPA.md"
grep -c "Migrado para galho próprio" "03-Dominios/Java/Backend/Spring Boot.md"
grep -nE "^## (Gerenciamento de transações|Spring MVC pipeline|Spring WebFlux)" "03-Dominios/Java/Backend/Spring Boot.md"
git status --short "03-Dominios/Java/Backend/Spring Security.md" "03-Dominios/Java/Backend/Kafka/"Expected: Spring Data JPA.md ~20-25 linhas, 1 callout “Migrado”, fabricação VAZIA; Spring Boot.md com ≥7 callouts “Migrado” (5 Galho 8 + 1 Galho 9 + 1 novo de transações), ## Gerenciamento de transações/## Spring MVC pipeline/WebFlux presentes (callouts/intocados); Spring Security.md/Kafka/ sem modificação.
-
Step 8: Skill
verificar-wikilinks— rodar na pasta03-Dominios/Java/Persistência de dados/+ conferir os arquivos tocados fora (MOC central, Dicionário, os dois troncos, os 3 arquivos Jakarta EE + 1 Spring Core index + 3 Web da dívida reversa). ÂncorasDicionário de Java#...resolvem 1:1 (cross-check com o grep da Task 19 Step 1). As ~204 quebras legadas da árvore Java NÃO são deste galho — só corrigir o que este galho introduziu. Corrigir e commitar à parte se houver. -
Step 9: Resumo de fechamento (sem commit) — reportar: 17 notas (5/6/6),
30 verbetes (272→300), MOC galho + MOC central, poda dos dois troncos (integral doSpring Data JPA.md— fabricação do MedEspecialista evaporada; cirúrgica da seção de transações doSpring Boot.md), dívida reversa quitada (11 ponteiros inline + 3 parágrafos; horizonte-lists e galhos 11-16 preservados como “(planejado)”), troncos vizinhos intocados (mostrar o grep), wikilinks limpos. Commits locais namain; push manual do usuário; sem deploy. Atualizar memória project_trilha_java com Galho 10 completo + fatos cravados via WebFetch (versão Hibernate ORM/Spring Data, UUID JPA 3.1, Flyway vs Liquibase, baseline 3.x/6.x).
Self-Review (preenchido na escrita do plano)
Spec coverage: Tasks 1-17 ↔ spec §3.1 (17 notas, escopos idênticos, opus 01/08/12/14/17, distribuição 5/6/6); Task 18 ↔ §3.2 (MOC, 5 rotas iguais); Task 19 ↔ §3.3 (~30 verbetes, âncoras 1:1 por grep, dups conferidos/linkados com Galhos 7/8); Task 20 ↔ §3.4 (linha 40); Task 21 ↔ §3.5.1 (poda integral Spring Data JPA.md → hub, fabricação evaporada, publish: false mantido); Task 22 ↔ §3.5.2 (poda cirúrgica — só ## Gerenciamento de transações; ### Persistência/### Bean Validation sob Camadas típicas intactos; callouts dos Galhos 8/9 intocados); Task 23 ↔ §3.6 (11 ponteiros inline + 3 parágrafos, mapeamento idêntico, horizonte-lists :95/:97 preservados, galhos 11-16 como texto); Task 0 ↔ §6 (pré-flight, baseline 272, ranges dos dois troncos); Task 24 ↔ §7. Tripla fronteira-assinatura (§4.3.1) garantida por links obrigatórios pros Galhos 7/8/9 nas Tasks 1/2/3/5/7/10/12/15/17 e pelo grep da Task 24 Step 5; fronteira galhos 11-16 pelo grep da Task 24 Step 4.
Placeholder scan: sem TBD/TODO; cada nota tem fonte WebFetch nomeada com URL, frontmatter concreto, H3s, armadilhas mínimas com conteúdo real, tamanho-alvo herdado das convenções. Pontos version-sensitive marcados com “verificar/confirmar” são instruções de verificação WebFetch (parte pesquisa do galho híbrido), não placeholders: versão Hibernate ORM/Spring Data (baseline 6.x), UUID na JPA 3.1, @Transactional(readOnly), Flyway vs Liquibase, baseline Boot 3.x. A confirmação dos ranges/linhas dos troncos e da dívida reversa (Tasks 0/21/22/23) é resolução-na-execução por política §9 do roadmap (ler antes de podar/editar).
Type/naming consistency: numeração 01-17 idêntica entre tasks, MOC, Dicionário, dívida reversa, poda e cheatsheet da capstone; distribuição 5/6/6 consistente; opus 01/08/12/14/17 marcadas ⟦opus⟧; filenames com em dash (sem :// — nota 12 usa “@Transactional propagação, isolamento, rollback, readOnly” sem dois-pontos; nota 15 usa “Specifications, Criteria e SQL”); mapeamento de link-back Galho 7→nota (09/10/11), Galho 8→nota (09/10), Galho 9→nota (05/08) consistente entre spec §3.1, convenções e Tasks; âncoras do Dicionário extraídas por grep antes de inserir (Task 19) e validadas na Task 24; verbetes adjacentes (persistence context (1º nível)↔persistence context, @Transactional (propagação)↔@Transactional) linkados, não duplicados.