visual vertical uiswing tutorial setborder layouts javase fillers docs crear con borde java hibernate orm jpa one-to-many

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 llamada B Hay una tabla de unión que se llama A_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 tabla A y tiene el mismo tipo que la clave principal de la tabla A 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 tabla A La otra columna de clave externa se refiere a la tabla B y tiene el mismo tipo que la clave primaria de la tabla B 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 tabla B

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


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.