Entrada

JPA relationship

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
@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.

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

Para Task agregamos lo siguiente.

1
2
3
4
5
6
7
8
    @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

Esta entrada está licenciada bajo CC BY 4.0 por el autor.