unidirectional onetomany one manytoone many ejemplo java hibernate java-ee jpa relationship

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ón JOINED 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 de OneToOne 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.


Normalmente diferencio estos dos a través de este diagrama:

Use PrimaryKeyJoinColumn

Use JoinColumn