Volver al blog

JPA relationship

Resumen Técnico & Objetivo

Como implementar una relación muchos a muchos con JPA Aquí el script de base de datos que utilice escrito en H2 Modelo de User Modelo de Task Ahora para agregar la relación hay ...


Como implementar una relación muchos a muchos con JPA

Database model many to many @saidmlx

Aquí el script de base de datos que utilice escrito en H2

DROP TABLE IF  EXISTS USERS_TASKS;
DROP TABLE IF  EXISTS TASKS;
DROP TABLE IF  EXISTS USERS; 


CREATE TABLE USERS(ID bigint auto_increment, NAME VARCHAR(255) null);
INSERT INTO USERS (NAME) VALUES ('Melissa');
INSERT INTO USERS (NAME) VALUES ('Fernando');
 
CREATE TABLE TASKS(ID bigint auto_increment, DESCRIPTION VARCHAR(255) null, PRIORITY bigint null);
INSERT INTO TASKS (DESCRIPTION, PRIORITY) VALUES ('Wake up',1);
INSERT INTO TASKS (DESCRIPTION, PRIORITY) VALUES ('Take a shower',2);


CREATE TABLE USERS_TASKS(ID_USER bigint null, ID_TASK bigint null );
INSERT INTO USERS_TASKS (ID_USER,ID_TASK) VALUES (1,1);
INSERT INTO USERS_TASKS (ID_USER,ID_TASK) VALUES (2,1);

Modelo de User

@Entity
@Table(name="USERS")
public class User {

	@Id
	@Column(name = "ID")
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	private Long id;
	
	@Column(name = "NAME")
	private String name;
	
	/* aqui van los geters and seters*/
}

Modelo de Task

@Entity
@Table(name = "TASKS")
public class Task  implements Serializable{
	
	@Id
	@Column(name="ID")
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	private long id;
	
	@Column(name="DESCRIPTION")
	private String description;
	
	@Column(name="PRIORITY")
	private long priority;
	
	/* aqui van los geters and seters*/
}

Ahora para agregar la relación hay que modificar las dos clases.

Para User agregamos lo siguiente.

    @ManyToMany(mappedBy = "users")
	Set<Task> tasks= new HashSet<>();

Para Task agregamos lo siguiente.

    @ManyToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
	@JoinTable(
			name = "USERS_TASKS",
			joinColumns = @JoinColumn(name = "ID_TASK"),
			inverseJoinColumns = @JoinColumn(name = "ID_USER")
			)
	@JsonIgnore
	Set<User> users = new HashSet<>();

si todo lo anterior lo ponemos en un REST API tenemos el siguiente resultado

Servicio Users

Database model many to many @saidmlx

Servicio Tasks

Database model many to many @saidmlx

Si quieres obtener el codigo completo puedes descargarlo desde mi repositorio GITHUB jpa-relationships rama many-to-many-relationship