Saltar al contenido

JPA: ¿diferencia entre @JoinColumn y @PrimaryKeyJoinColumn?

Esta es la solución más completa que te podemos compartir, pero primero obsérvala pausadamente y valora si se adapta a tu proyecto.

Solución:

¿Qué sucede si promociono la columna para que también sea un PK (también conocido como relación de identificación)? Como la columna ahora es PK, debo etiquetarla con @Id (…).

Este mayor apoyo de identificadores derivados es en realidad parte de las cosas nuevas en JPA 2.0 (ver 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ías que usar PrimaryKeyJoinColumn y también definir un BasicId cartografía para el extranjero key columna.

Ahora la pregunta es: ¿@Id + @JoinColumn son lo mismo que @PrimaryKeyJoinColumn?

Puede obtener un resultado similar pero usando un Id en OneToOne o ManyToOne es mucho más simple y es la forma preferida de mapear identificadores derivados con JPA 2.0. PrimaryKeyJoinColumn todavía podría ser utilizado en un UNIDO estrategia de herencia. Debajo de la sección relevante de la especificación JPA 2.0:

11.1.40 Anotación PrimaryKeyJoinColumn

los PrimaryKeyJoinColumn anotación especifica un primario key columna que se utiliza como extranjera key para unirse a otra tabla.

los PrimaryKeyJoinColumn La anotación se utiliza para unir la tabla principal de una subclase de entidad en el JOINED
estrategia de mapeo a la tabla principal de su superclase; se usa dentro de un
SecondaryTable anotación para unir una tabla secundaria a una tabla principal; y puede ser utilizado en un OneToOne
mapeo en el que el primario key de la entidad de referencia se utiliza como extranjero key a la entidad referenciada[108].

Si no PrimaryKeyJoinColumn
se especifica una anotación para una subclase en la estrategia de mapeo JOINED, el foráneo key Se supone que las columnas tienen los mismos nombres que las primarias. key
columnas 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 id derivados descritos en la sección 2.4.1.1 ahora son preferibles a
PrimaryKeyJoinColumn para el caso de mapeo OneToOne.

Ver también

  • Claves primarias a través de relaciones OneToOne

Esta fuente http://weblogs.java.net/blog/felipegaucho/archive/2009/10/24/jpa-join-table-additional-state afirma que usar @ManyToOne y @Id funciona con JPA 1.x. ¿Quién tiene razón ahora?

El autor está usando un prelanzamiento JPA 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 es NO parte de JPA 1.0.

Para que conste, el apoyo de Id en OneToOne y ManyToOne se ha agregado en EclipseLink 1.1 (consulte este mensaje de James Sutherland, autor de EclipseLink y colaborador principal del libro wiki de Java Persistence). Pero déjame insistir, esto es NO parte de JPA 1.0.

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

Utilizar PrimaryKeyJoinColumn

ingrese la descripción de la imagen aquí

Utilizar JoinColumn

ingrese la descripción de la imagen aquí

Sé que esta es una publicación antigua, pero es un buen momento para usar PrimaryKeyColumn sería si quisiera una relación unidireccional o si tuviera varias tablas, todas compartiendo la misma identificación.

En general, esta es una mala idea y sería mejor utilizar extranjeros key relaciones con JoinColumn.

Habiendo dicho eso, si está trabajando en una base de datos más antigua que usaba un sistema como este, entonces sería un buen momento para usarlo.

Si haces scroll puedes encontrar las explicaciones de otros creadores, tú asimismo puedes dejar el tuyo si te apetece.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *