java - ejemplo - @ ManyToMany/@ OneToMany atributo mapeado por asociación bidireccional
one to many jpa (1)
Estoy trabajando en un kit de conformidad JPA para mi pasantía ... Parte de ese kit implica probar la implementación correcta de casos de esquina.
@ManyToMany
tiene un atributo mappedBy. JPA dice que:
String mappedBy: el campo o la propiedad que posee la relación. Requerido a menos que la relación sea unidireccional.
No se proporciona ningún valor predeterminado: la columna predeterminada está vacía.
Dado un @ManyToMany
bidireccional, este ejemplo proviene de la especificación JPA 2.0 JSR-317.
Cliente
@ManyToMany
@JoinTable(name="CUST_PHONES")
public Set<PhoneNumber> getPhones() { return phones; }
Número de teléfono
@ManyToMany(mappedBy="phones")
public Set<Customer> getCustomers() { return customers; }
¡El atributo mappedBy no se ha definido en @ManyToMany
of Customer
! ¿Hay un valor predeterminado para las asignaciones bidireccionales de las que no tengo conocimiento, o qué?
Miré casos similares y encontré: @OneToOne
- mappedBy es opcional, no predeterminado @OneToMany
- exactamente lo mismo que @ManyToMany
(mappedBy es opcional para bidireccional, sin ningún defecto)
En resumen, mi pregunta: para @ManyToMany
y @OneToMany
, ¿qué debería colocarse en el atributo mappedBy para el lado propietario de la relación ( Customer
en el ejemplo)?
Esto está lejos de ser un caso de esquina. Cada asociación bidireccional tiene un lado propietario y un lado inverso.
JPA usa el lado propietario para decidir si existe una asociación entre dos entidades. El otro lado es ignorado.
El lado propietario es el que define cómo se asocia la asociación (utilizando las anotaciones JoinColumn, JoinTable, etc.). No tiene ningún atributo mappedBy
.
El lado inverso usa el atributo mappedBy
para decir: "Oye, solo soy la asociación inversa de la asignada por la siguiente propiedad".
Entonces, por definición, el lado propietario no tiene un atributo mappedBy
. Si tuviera uno, no sería el lado dueño.
Esto está bien explicado en la especificación de JPA . Si necesita construir un kit de cumplimiento para esta especificación, será mejor que lo lea y comprenda.
Realmente no veo el sentido de escribir un kit de compatibilidad como, tal como está escrito en la página de inicio de JPA2 JPA ,
Tal como lo exige el Acuerdo de Participación de Especificación de Java (JSPA), la API Java Persistence, versión 2.0 TCK se licenciará sin costo alguno sin la asistencia de entidades calificadas sin fines de lucro. Tal calificación será verificada por el Programa de Becas de Pruebas de Compatibilidad. El apoyo también se puede proporcionar sin costo con la aprobación de la junta de becas. Para obtener más información, consulte: http://java.sun.com/scholarship/ .