vertical - swing fillers java
@OneToMany sin relación inversa y sin una tabla de unión? (3)
Este es un problema similar a "Hibernar @OneToMany sin una tabla de combinación separada" , en el sentido de que necesito una relación @OneToMany sin una tabla de unión. Sin embargo, también me gustaría no definir la relación inversa. La eliminación de la inversa parece dar como resultado una tabla de unión que se genera automáticamente ... ¿hay alguna solución para esto?
En JPA 2.0+ puede usar @JoinColumn como una forma de evitar generar tablas unidas.
Intentalo.
@OneToMany
@JoinColumn(name="COLUMN_NAME")
ACTUALIZAR
La información proporcionada anteriormente se ha extraído de EJB 3.0 o''reilly book (Buscar La anotación @JoinColumn hace referencia a la columna CUSTOMER_ID en la tabla TELÉFONO). Sin embargo, la especificación JPA 1.0 no admite esta característica. Lo que dice es
Las relaciones unidireccionales de uno a muchos pueden implementarse usando asignaciones de clave externa de uno a muchos, sin embargo, tal soporte no es necesario en esta versión. Las aplicaciones que deseen utilizar una estrategia de asignación de clave externa para relaciones de uno a muchos deben hacer que estas relaciones sean bidireccionales para garantizar la portabilidad
Entonces en 1.0 es una implementación específica del vendedor (Y tiene sentido, el autor trabaja en JBoss - La división del sombrero rojo detrás de la hibernación)
Pero es compatible con la implementación de JPA 2.0
Si la combinación es para una asignación OneToMany unidireccional utilizando una estrategia de asignación de clave externa, la clave externa está en la tabla de la entidad objetivo .
La especificación JPA 1.0 NO es compatible con la asignación OneToMany unidireccional sin una tabla de unión.
Y el uso de JoinColumn
en OneToMany
no está permitido en JPA 1.0 estándar (solo en OneToOne
, ManyToOne
o ManyToMany
). Sin embargo, está en JPA 2.0.
De la especificación JPA 1.0:
2.1.8.5.1 Relaciones unidireccionales OneToMany
Se aplican los siguientes valores predeterminados de asignación:
La entidad A está asignada a una tabla llamada
A
La entidad B está asignada a una tabla llamadaB
Hay una tabla de unión que se llamaA_B
(nombre del propietario primero). Esta tabla de unión tiene dos columnas de clave externa. Una columna de clave externa se refiere a la tablaA
y tiene el mismo tipo que la clave principal de la tablaA
El nombre de esta columna de clave externa se forma como la concatenación de lo siguiente: el nombre de la entidad A; "_"; el nombre de la columna de la clave principal en la tablaA
La otra columna de clave externa se refiere a la tabla B y tiene el mismo tipo que la clave primaria de la tablaB
y hay una restricción de clave única sobre ella. El nombre de esta columna de clave externa se forma como la concatenación de lo siguiente: el nombre de la propiedad de relación o campo de la entidad A; "_"; el nombre de la columna de clave primaria en la tablaB
En resumen, si no desea una Tabla de unión (y soporte completo de lectura / escritura) y aún desea cumplir con JPA, haga que la asociación sea bidireccional (con un lado inverse
).
El enlace del libro wiki a continuación discute un truco (mapeando la tabla de objetivos como la tabla de unión) para "solucionar" el problema, pero esto solo funciona para lecturas, las escrituras no funcionarán.
Referencias
- Especificación JPA 1.0
- 2.1.8.2 Relaciones Bidireccionales ManyToOne / OneToMany
- 2.1.8.5.1 Relaciones unidireccionales OneToMany
- 9.1.6 Annotation JoinColumn (discute en qué contexto se puede usar esta anotación)
- Libro JPA Wiki
Si no hay una tabla de unión en la base de datos, la relación entre dos tablas en la base de datos se logrará mediante una clave externa que haga referencia a la clave principal. Si la relación es a través de PK / FK, tiene que haber una propiedad en la clase objetivo que haga referencia a la fuente para que la columna FK se rellene con un valor. Esta propiedad en la clase objetivo podría ser un id o un objeto fuente. Si es un objeto fuente, entonces necesitas tener un @ManyToOne inverso en la clase objetivo.