0%
Relações entre entidades

Relações

Onde o SQL gerado deixa de ser óbvio, e onde nascem os N+1.

15-20 min

Relações entre entidades

Uma entidade isolada é um exercício. O trabalho real começa quando as entidades se referenciam: um autor tem livros, um pedido tem itens, um livro pertence a categorias. É aí que o ORM deixa de fazer o que se espera, porque Java e SQL não expressam a mesma coisa.

Em Java, uma associação é bidirecional por natureza: se commande.getLignes() contém um item, é natural que ligne.getCommande() retorne esse pedido. Em SQL, existe apenas uma coisa: uma coluna de chave estrangeira, em uma única tabela, de um único lado. A bidirecionalidade Java é uma ficção que você mantém à mão. Quando esquece de mantê-la, você obtém uma entidade cujos dois lados se contradizem — e o Hibernate escreverá o que diz o lado proprietário, não o que diz o seu código.

Três famílias de problemas saem desta lição, e cada uma delas aparece em produção. A primeira é a LazyInitializationException, que surge quando se lê uma relação depois do fechamento da transação. A segunda é a cascata REMOVE, que apaga mais linhas do que o previsto porque atravessa todo o grafo. A terceira é o @OneToMany unidirecional, que cria uma tabela de junção que ninguém pediu e torna cada exclusão quadrática.

Comentários

Os comentários são alimentados pelo GitHub Discussions

Conecte-se com o GitHub para participar da discussão

Link copiado!