Documentos de Académico
Documentos de Profesional
Documentos de Cultura
ManyToMany
1. Introducción
Java Persistence API, más conocida por sus siglas JPA, es la API de
persistencia desarrollada para la plataforma Java EE . La cual es un
framework del lenguaje de programación Java, que maneja datos
relacionales en aplicaciones usando la plataforma Java en sus ediciones
Standard (Java SE) y Enterprise (Java EE) .
Una buena práctica es usar cascade en la entidad padre ya que nos permite
propagar los cambios y aplicarlos a los hijos. En nuestro ejemplo, tuition no
tiene sentido que exista si student no existe, por lo que student es el que
tendrá el rol padre.
1 @Entity
2 @Table(name = "tuition")
3 public class Tuition {
4
5 @Id
6 @GeneratedValue(strategy = GenerationType.IDENTITY)
7 private Long id;
8
9 private Double fee;
10
11 // Que columna en la tabla Tuition tiene la FK
12 @JoinColumn(name = "student_id")
13 @OneToOne(fetch = FetchType.LAZY)
14 private Student student;
15
16 /* Getters and setters */
17}
Vamos a crear un test muy simple para comprobar la sentencia sql que se
está ejecutando.
1 @Test
2 @Transactional
3 @Rollback(false)
4 public void check_sql_statement_when_persisting_in_one_to_one_bidirectional() {
5
6 Student student = new Student();
7 student.setName("Jonathan");
8
9 Tuition tuition = new Tuition();
10 tuition.setFee(150);
11 tuition.setStudent(student);
12
13 student.setTuition(tuition);
14
15 entityManager.persist(student);
16 }
1 @Entity
2 @Table(name = "tuition")
3 public class Tuition {
4
5 @Id
6 private Long id;
7
8 private Double fee;
9
10 @MapsId
11 @OneToOne(fetch = FetchType.LAZY)
12 private Student student;
13
14 /* Getters and setters */
15}
1 @Entity
2 @Table(name = "students")
3 public class Student {
4
5 @Id
6 @GeneratedValue(strategy = GenerationType.IDENTITY)
7 private Long id;
8
9 private String name;
10
11 @ManyToOne()
12 @JoinColumn(name = "university_id")
13 private University university;
14
15 /* Getters and setters */
16}
1 @Test
2 @Transactional
3 @Rollback(false)
4 public void check_sql_statement_when_persisting_in_one_to_many_unidirectional() {
5 University university = new University();
6 university.setName("Universidad de Las Palmas de Gran Canaria");
7
8 Student student1 = new Student();
9 student1.setName("Ana");
10
11 Student student2 = new Student();
12 student2.setName("Jonathan");
13
14 university.setStudents(List.of(student1, student2));
15
16 entityManager.persist(university);
17 }
¿Por qué se ejecutan los Update?
1 @Entity
2 @Table(name="course")
3 public class Course {
4
5 @Id
6 @GeneratedValue(strategy = GenerationType.IDENTITY)
7 private Long id;
8
9 private String name;
10
11 private Double fee;
12
13 @ManyToMany(mappedBy = "courses")
14 private Set<Student> students;
15
16 /* Getters and setters */
17}
1 @Entity
2 @Table(name="student")
3 public class Student {
4
5 @Id
6 @GeneratedValue(strategy = GenerationType.IDENTITY)
7 private Long id;
8
9 private String name;
10
11 @ManyToMany(cascade = {
12 CascadeType.PERSIST,
13 CascadeType.MERGE
14 })
15 @JoinTable(
16 name = "student_course",
17 joinColumns = {@JoinColumn(name = "student_id")},
18 inverseJoinColumns = {@JoinColumn(name = "course_id")}
19 )
20 private Set<Course> courses;
21
22 /* Getters and setters */
23}