JPA relationship
Como implementar una relación muchos a muchos con JPA
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
Servicio Tasks
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.