Relaciones
Donde el SQL generado deja de ser evidente y donde nacen los N+1.
Relaciones entre entidades
Una entidad aislada es un ejercicio. El trabajo real empieza cuando las entidades se referencian entre sí: un autor tiene libros, un pedido tiene líneas, un libro pertenece a varias categorías. Ahí es donde el ORM deja de hacer lo que esperamos, porque Java y SQL no expresan lo mismo.
En Java, una asociación es bidireccional por naturaleza: si commande.getLignes() contiene una línea, es natural que ligne.getCommande() devuelva ese pedido. En SQL, solo existe una cosa: una columna de clave foránea, en una sola tabla, en un solo lado. La bidireccionalidad de Java es una ficción que usted mantiene a mano. Cuando se olvida de mantenerla, obtiene una entidad cuyos dos lados se contradicen, y Hibernate escribirá lo que dice el lado propietario, no lo que dice su código.
De esta lección salen tres familias de problemas, y cada una se encuentra en producción. La primera es LazyInitializationException, que aparece cuando se lee una relación después de cerrar la transacción. La segunda es la cascada REMOVE, que elimina más filas de las previstas porque recorre todo el grafo. La tercera es el @OneToMany unidireccional, que crea una tabla de unión que nadie ha pedido y que vuelve cuadrática cada eliminación.
Comentarios
Los comentarios funcionan con GitHub Discussions
Inicia sesión con GitHub para participar en la discusión