¿Qué sucede si promociono la columna para que sea un / el PK también (también conocido como relación de identificación)? Como la columna ahora es el PK, debo etiquetarla con @Id (...).
Este soporte mejorado de identificadores derivados es en realidad parte de las novedades en JPA 2.0 (consulte la sección 2.4.1 Claves primarias correspondientes a identidades derivadas en la especificación JPA 2.0), JPA 1.0 no permite Id
en un OneToOne
o ManyToOne
. Con JPA 1.0, tendría que usar PrimaryKeyJoinColumn
y también definir una Basic
Id
asignación para la columna de clave externa.
Ahora la pregunta es: ¿@Id + @JoinColumn es lo mismo que @PrimaryKeyJoinColumn?
Puede obtener un resultado similar, pero usando un Id
on OneToOne
o ManyToOne
es mucho más simple y es la forma preferida de mapear identificadores derivados con JPA 2.0. PrimaryKeyJoinColumn
aún podría usarse en una estrategia de herencia JOINED . Debajo de la sección relevante de la especificación JPA 2.0:
11.1.40 Anotación de PrimaryKeyJoinColumn
La PrimaryKeyJoinColumn
anotación especifica una columna de clave principal que se utiliza como clave externa para unirse a otra tabla.
La PrimaryKeyJoinColumn
anotación se utiliza para unir la tabla principal de una subclase de entidad en la JOINED
estrategia de mapeo a la tabla principal de su superclase; se utiliza dentro de una
SecondaryTable
anotación para unir una tabla secundaria a una tabla principal; y se puede utilizar en un OneToOne
mapeo en el que la clave primaria de la entidad de referencia se utiliza como clave foránea para la entidad de referencia [108] .
...
Si no PrimaryKeyJoinColumn
se especifica ninguna anotación para una subclase en la estrategia de mapeo JOINED, se asume que las columnas de clave externa tienen los mismos nombres que las columnas de clave primaria de la tabla primaria 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 identificación derivados descritos en la sección 2.4.1.1 ahora son preferibles en
PrimaryKeyJoinColumn
el caso de mapeo OneToOne.
Ver también
Esta fuente http://weblogs.java.net/blog/felipegaucho/archive/2009/10/24/jpa-join-table-additional-state afirma que el uso de @ManyToOne y @Id funciona con JPA 1.x. ¿Quién tiene razón ahora?
El autor está utilizando una versión previa al lanzamiento compatible con JPA 2.0 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 que conste, se ha agregado compatibilidad con Id
on OneToOne
y ManyToOne
en EclipseLink 1.1 (consulte este mensaje de James Sutherland , comitter de EclipseLink y colaborador principal del libro wiki de Java Persistence ). Pero déjeme insistir, esto NO es parte de JPA 1.0.
Normalmente diferencio estos dos a través de este diagrama:
Utilizar
PrimaryKeyJoinColumn
Utilizar
JoinColumn
fuente
PrimaryKeyJoinColumn
use el mismo valor de clave principal para unir dos tablas, yJoinColumn
la clave principal de la tabla principal se convertirá en clave externa en otra tabla.Sé que esta es una publicación antigua, pero un buen momento para usarla
PrimaryKeyColumn
sería si quisiera una relación unidireccional o si tuviera varias tablas que compartan la misma identificación.En general, esta es una mala idea y sería mejor usar relaciones de clave externa con
JoinColumn
.Habiendo dicho eso, si está trabajando en una base de datos más antigua que usaba un sistema como este, sería un buen momento para usarlo.
fuente