Ya estoy inscrito ¿Todavía no tienes acceso? Nuestros Planes
Ya estoy inscrito ¿Todavía no tienes acceso? Nuestros Planes
1
respuesta

[Duda] dónde va el mappedBy en una relación ManyToMany

El tema visto me genera la siguiente inquietud, ¿cómo saber dónde colocar el mappedBy en una relación ManyToMany?

Según Luri sólo se puede hacer de la siguiente manera:

@Entity
public class Alumno {
    @Id
    private Long id;
    private String nombre;

    @ManyToMany
    private List<Profesor> profesores;
}

@Entity
public class Profesor {
    @Id
    private Long id;
    private String nombre;

    @ManyToMany(mappedBy = "profesores")
    private List<Alumno> alumnos;
}

Según Luri no se puede hacer de la siguiente manera:

@Entity
public class Alumno {
    @Id
    private Long id;
    private String nombre;
    
    @ManyToMany(mappedBy = "alumnos")
    private List<Profesor> profesores;
}

@Entity
public class Profesor {
    @Id
    private Long id;
    private String nombre;
    
    @ManyToMany
    private List<Alumno> alumnos;
}

No entiendo muy bien por qué.

¡Gracias por su atención!

1 respuesta

Hola Wilmar, espero que estés bien

Entiendo tu inquietud sobre dónde colocar el mappedBy en una relación ManyToMany en JPA. La clave para entender esto es saber que el mappedBy se utiliza para definir el lado no propietario de la relación. En una relación ManyToMany, uno de los lados debe ser el propietario, y el otro debe ser el lado inverso, que es donde se utiliza el mappedBy.

En el ejemplo que has proporcionado, el mappedBy = "profesores" en la clase Profesor indica que la propiedad profesores en la clase Alumno es la que realmente gestiona la relación. Esto significa que la tabla intermedia que JPA crea automáticamente para gestionar la relación ManyToMany se basa en la lista de profesores de Alumno.

Por otro lado, si intentas hacer lo contrario, es decir, poner mappedBy = "alumnos" en Alumno y no en Profesor, estarías indicando que Alumno es el lado inverso, lo cual no es correcto en este contexto porque Alumno es el que tiene la anotación @ManyToMany sin mappedBy, lo que lo convierte en el lado propietario.

Es importante recordar que el lado propietario es el que tiene el control sobre la relación y es responsable de la gestión de la tabla intermedia en la base de datos. Por eso, en tu ejemplo, Alumno es el lado propietario y Profesor es el lado inverso.

Espero que esta explicación te ayude a entender mejor cómo funciona el mappedBy en relaciones ManyToMany en JPA.

Dejo un material complementario sobre el tema: "Diferencia entre @JoinColumn y mappedBy" https://www.baeldung.com/jpa-joincolumn-vs-mappedby

Está en inglés pero puedes traducir vía Google Translate atajo en el navegador de su elección :)

¡Espero haber ayudado y buenos estudios!