Relaciónes @ManyToMany

Las relaciones Mucho a Muchos (@ManyToMany) se caracterízan por Entidades que están relacionadas con a muchos elementos de un tipo determinado, pero al mismo tiempo, estos últimos registros no son exclusivos de un registro en particular, si no que pueden ser parte de varios, por lo tanto, tenemos una Entidad A, la cual puede estar relacionada como muchos registros de la Entidad B, pero al mismo tiempo, la Entidad B puede pertenecer a varias instancias de la Entidad A.

Algo muy importante a tomar en cuenta cuando trabajamos con relaciones @ManyToMany, es que en realidad este tipo de relaciones no existen físicamente en la base de datos, y en su lugar, es necesario crear una tabla intermedia que relaciones las dos Entidades, veremos más adelante como resolvemos eso.

Un ejemplo clásico de estas relaciones son los libros con sus autores, de esta forma, un libro puede tener varios autores, y a su vez, los autores puede tener muchos libros. Pero para que quede más claro, veamos como quedarían las Entidades de Autor (Author), Libro (Book):


Entidad Book:

Como podemos apreciar, hemos creado una lista de tipo Author, la cual es anotada con @ManyToMany, adicional, hemos definido la anotación @JoinTable, la cual nos sirve para definir la estructura de la tabla intermedia que contendrá la relación entre los libros y los autores.

La anotación @JoinTable no es obligatoria en sí, ya que en caso de no definirse JPA asumirá el nombre de la tabla, columnas, longitud, etc. Para no quedar a merced de la implementación de JPA, siempre es recomendable definirla, así, tenemos el control total sobre ella.

Hemos definidos las siguientes propiedades de la anotación @JoinTable:

  • name: Nombre de la tabla que será creada físicamente en la base de datos.
  • joinColumns: Corresponde al nombre para el ID de la Entidad Book.
  • inverseJoinColumns: Corresponde al nombre para el ID de la Entidad Author


Entidad Author:

El caso de la Entidad Author es más simple, pues solo marcamos la colección con @ManyToMany, pero en este caso ya no es necesario definir la anotación @JoinTable, en su lugar, definimos la propiedad mappedBy para indicar la relación bidireccional y al mismo tiempo, JPA puede tomar la configuración del @JoinTable de Books.

Como resultado de estas Entidades, tendremos las siguientes tablas auto generadas:

Notemos en la tabla authors no tiene una columna que haga referencia a books, ni books a authors, si no que es necesario tener una tabla intermedia que haga el cruce entre las dos tablas.

La tabla intermedia (rel_book_auths) es generada por la anotación @JoinTable y sus dos columnas son llaves foraneas a las tablas books y authors.


Prueba de validación

Para comprobar que todo funciona como lo hemos dicho, vamos a realizar una prueba, la cual se ve de la siguiente manera:

Hemos creados dos libros y tres autores, y luego hemos asociado a los autores a los libros, con la intención de que los autores estén en dos libros y los libros tengan varios autores.

Ahora veamos como se ven las tablas authors, books y rel_books_auths:

Para poder obtener la relación entre libros y autores solo faltaría hacer la unión entre las dos tablas.

Conclusiones

Para concluir solo faltaría resaltar que en las relaciones @ManyToMany los registros son independientes de los registros a los que son relacionados, por lo que en este caso, podrían existir los autores si no existieran los libros, y al revés.

AnteriorÍndiceSiguiente



Artículos relacionados


Como crear un DataSource en WebLogic En este artículo les explico los pasos que se tiene que llevar a cabo para registrar un nuevo Data Source en WebLogic. Los Data Source o fuentes de da...
Creando un API REST en Java (parte 1) Sin lugar a duda, los servicios REST ya se han convertido en la principal tecnología para construir servicios, superando con creces a los servicios SO...
Web Services con Java (JAX-WS) Los Web Services cada vez son más indispensable a la hora de construir aplicaciones, debido a que ya casi cualquier aplicación empresarial, requiere i...
Mapeo de fechas con @Temporal Mediante la anotación @Temporal es posible mapear las fechas con la base de datos de una forma simple. Una de las principales complicaciones cuando t...
Operaciones básicas Una parte esencial de utilizar JPA es saber utilizar las operaciones básicas, operaciones mediante las cuales es posible consultar, persistir, actuali...
Java – Como eliminar rápidamente elementos r... Hace tiempo un amigo me preguntaba  como podía eliminar los elementos repetidos de una colección sin hacer mucho esfuerzo. Bien la solución que consid...
Mapeo de tablas con @Table En la sección hablaremos de la anotación   y su importancia a la hora de definir entidades. La anotación @Table es utilizada para indicarle a JPA cont...
Java 8 – Streams Los Streams son una secuencia de elementos que soportan operaciones de agregación secuencial y paralela. Una de las nuevas características de Java 8 q...
Métodos HTTP (REST) Los métodos HTTP definen la acción que se realizará sobre un determinado recurso. Los métodos HTTP, también suelen ser llamados HTTP Verbs. Aunque el ...
JPA, Hibernate VS JDBC Los que ya han tenido la oportunidad de trabajar con algún ORM como JPA o Hibernate sabrán las bondades que tiene ya que nos permite desarrollar de un...

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *