java - onetomany - JPA: ¿diferencia entre @JoinColumn y @PrimaryKeyJoinColumn?
onetomany jpa ejemplo (2)
¿Cuál es la diferencia exacta entre @JoinColumn
y @PrimaryKeyJoinColumn
?
Utiliza @JoinColumn
para columnas que son parte de una clave externa. Una columna típica podría verse (por ejemplo, en una tabla de combinación con atributos adicionales):
@ManyToOne
@JoinColumn(name = "...")
private OtherClass oc;
¿Qué sucede si promociono que la columna sea a / the PK también (también conocida como relación de identificación)? Como la columna ahora es PK, debo etiquetarla con @Id
:
@Id
@ManyToOne
@JoinColumn(name = "...")
private OtherClass oc;
Ahora la pregunta es:
¿ @Id
+ @JoinColumn
lo mismo que @PrimaryKeyJoinColumn
?
@ManyToOne
@PrimaryKeyJoinColumn(name = "...")
private OtherClass oc;
Si no, ¿para qué está @PrimaryKeyJoinColumn
?
¿Qué sucede si promociono que la columna sea a / the PK también (también conocida como relación de identificación)? Como la columna ahora es PK, debo etiquetarla con @Id (...).
Este soporte mejorado de identificadores derivados es en realidad parte de lo nuevo en JPA 2.0 (consulte la sección 2.4.1 Claves principales correspondientes a identidades derivadas en la especificación JPA 2.0), JPA 1.0 no permite Id
en OneToOne
o ManyToOne
. Con JPA 1.0, tendría que usar PrimaryKeyJoinColumn
y también definir una asignación de Id
Basic
para la columna de clave externa.
Ahora la pregunta es: ¿@Id + @JoinColumn es lo mismo que solo @PrimaryKeyJoinColumn?
Puede obtener un resultado similar, pero usar una Id
en OneToOne
o ManyToOne
es mucho más simple y es la forma preferida de asignar identificadores derivados con JPA 2.0. PrimaryKeyJoinColumn
aún se puede usar en una estrategia de herencia PrimaryKeyJoinColumn
. Debajo de la sección relevante de la especificación JPA 2.0:
11.1.40 Anotación de PrimaryKeyJoinColumn
La anotación
PrimaryKeyJoinColumn
especifica una columna de clave principal que se utiliza como clave externa para unirse a otra tabla.La anotación
PrimaryKeyJoinColumn
se usa para unir la tabla primaria de una subclase de entidad en la estrategia de asignaciónJOINED
a la tabla primaria de su superclase; se usa dentro de una anotación de tabla secundaria para unir una tabla secundaria a una tabla primaria; y puede usarse en un mapeo deOneToOne
en el que la clave primaria de la entidad de referencia se utiliza como una clave foránea para la entidad a la que se hace referencia [108] ....
Si no se especifica una anotación
PrimaryKeyJoinColumn
para una subclase en la estrategia de asignación JOINED, se supone que las columnas de clave externa tienen los mismos nombres que las columnas de clave principal de la tabla principal de la superclase....
Ejemplo: subclase Customer y ValuedCustomer
@Entity @Table(name="CUST") @Inheritance(strategy=JOINED) @DiscriminatorValue("CUST") public class Customer { ... } @Entity @Table(name="VCUST") @DiscriminatorValue("VCUST") @PrimaryKeyJoinColumn(name="CUST_ID") public class ValuedCustomer extends Customer { ... }
[108] Los mecanismos de id. Derivados que se describen en la sección 2.4.1.1 ahora son preferibles a
PrimaryKeyJoinColumn
para el caso de asignación de OneToOne.
Ver también
Esta fuente http://weblogs.java.net/blog/felipegaucho/archive/2009/10/24/jpa-join-table-additional-state indica que el uso de @ManyToOne y @Id funciona con JPA 1.x. ¿Quién está correcto ahora?
El autor está utilizando una versión de JCL 2.0 versión compatible de EclipseLink (versión 2.0.0-M7 en el momento del artículo) para escribir un artículo sobre JPA 1.0 (!). Este artículo es engañoso, el autor está usando algo que NO es parte de JPA 1.0.
Para el registro, el soporte de Id
en OneToOne
y ManyToOne
ha sido agregado en EclipseLink 1.1 (vea este mensaje de James Sutherland , comitente de EclipseLink y principal colaborador del libro wiki de Java Persistence ). Pero déjame insistir, esto NO es parte de JPA 1.0.