¿Cuál es la diferencia exacta entre @JoinColumn y @PrimaryKeyJoinColumn?

Utilizar @JoinColumn de las columnas que son parte de una clave externa. Una típica columna podría parecer (por ejemplo, en una tabla de combinación con atributos adicionales):

@ManyToOne
@JoinColumn(name = "...")
private OtherClass oc;

¿Qué sucede si me promover la columna para ser un/el PK, también (un.k.una. la identificación de la relación)? Como la columna es ahora el PK, I debe etiquetar con @Id:

@Id
@ManyToOne
@JoinColumn(name = "...")
private OtherClass oc;

Ahora la pregunta es:

Son @Id + @JoinColumn el mismo que @PrimaryKeyJoinColumn?:

@ManyToOne
@PrimaryKeyJoinColumn(name = "...")
private OtherClass oc;

Si no, lo que @PrimaryKeyJoinColumn ahi?

InformationsquelleAutor Kawu | 2010-08-05

2 Comentarios

  1. 49

    ¿Qué sucede si me promover la columna para ser un/el PK, también (un.k.una. la identificación de la relación)? Como la columna es ahora el PK, I debe etiquetar con @Id (…).

    Este soporte mejorado de derivados de los identificadores de es en realidad parte de la cosas nuevas en JPA 2.0 (véase la sección 2.4.1 Primaria Teclas Correspondientes a Derivados de Identidades en la JPA 2.0 de la especificación), JPA 1.0 no permite Id en un OneToOne o ManyToOne. Con JPA 1.0, usted tendría que usar PrimaryKeyJoinColumn y también definir un Basic Id asignación para la columna de clave externa.

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

    Usted puede obtener un resultado similar pero utilizando un Id en OneToOne o ManyToOne es mucho más simple y es la manera preferida de mapa derivados de los identificadores con JPA 2.0. PrimaryKeyJoinColumn todavía podría ser utilizado en un se UNIÓ a herencia de la estrategia. A continuación, la sección correspondiente de la JPA 2.0 especificación:

    11.1.40 PrimaryKeyJoinColumn Anotación

    La PrimaryKeyJoinColumn anotación
    especifica una columna de clave principal que es
    se utiliza como una clave externa para unirse a
    otra tabla.

    La PrimaryKeyJoinColumn anotación
    se utiliza para unir la tabla principal de
    una entidad subclase en la JOINED
    estrategia de asignación de la tabla principal
    de su superclase; se utiliza dentro de un
    SecondaryTable anotación para unirse a un
    tabla secundaria a una primaria de la tabla;
    y puede ser utilizado en un OneToOne
    la cartografía en la que la clave principal de
    la entidad de referencia se utiliza como un
    clave externa a la que se hace referencia
    entidad[108].

    Si no PrimaryKeyJoinColumn
    la anotación se especifica para una subclase
    en el se UNIÓ a la asignación de la estrategia, la
    las columnas de clave externa se supone que
    tienen los mismos nombres como los de clave principal
    las columnas de la tabla principal de la
    superclase.

    Ejemplo: Cliente y ValuedCustomer subclase

    @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] La derivada de la identificación de los mecanismos de
    se describe en la sección 2.4.1.1 ahora
    preferible
    PrimaryKeyJoinColumn para la
    OneToOne asignación de caso.

    Véase 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. Que es correcto ahora?

    El autor está utilizando una versión preliminar JPA 2.0 compatible con la versión 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 el registro, el soporte de la Id en OneToOne y ManyToOne se ha añadido en EclipseLink 1.1 (ver este mensaje de James Sutherland, EclipseLink comitter y principal colaborador de la Java Persistence wiki libro). Pero permítanme insistir, esto es NO parte de JPA 1.0.

    • Esta fuente weblogs.java.net/blog/felipegaucho/archive/2009/10/24/… estados que el uso de @ManyToOne y @Id funciona con JPA 1.x. Que es correcto ahora?
    • Ver mis actualizaciones.
    • OK. Gracias por aclarar. Yo estoy en lo correcto de que el mal ejemplo se refiere a los usos @IdClass erróneamente? No debería el @Id anotaciones ser colocado en el independiente (redundantes o duplicados) columnas en la clase de entidad para ser correcto? (ven a pesar de que sé que el uso de @IdClass no se recomienda más)
    • Quiero decir, no deben ser dos de las propiedades de la clase: @Id @Columna de la Cadena privada de la institución; y @Id @Columna de la Cadena privada de la competencia; sólo para especificar el PK derecho?
    • Lo siento, pero sinceramente, es muy difícil hablar de esto en un pequeño cuadro de comentario. Ni siquiera estoy seguro de que he entendido de lo que estás hablando. Si usted tiene otra pregunta específica, sugiero escoger una implementación de JPA y experimentar un poco o para publicar un nuevo a la pregunta con un ejemplo completo (y el JPA versión). Esto haría las cosas mucho más fáciles.
  2. 22

    Yo normalmente se diferencian estos dos a través de este diagrama:

    Uso PrimaryKeyJoinColumn

    JPA: diferencia entre @JoinColumn y @PrimaryKeyJoinColumn?

    Uso JoinColumn

    JPA: diferencia entre @JoinColumn y @PrimaryKeyJoinColumn?

    • Puede usted explicar con un ejemplo? gracias.
    • utilizar el mismo valor de la clave principal para unir dos tablas, y JoinColumn, la clave principal de la tabla principal se convertirá en la clave externa de la otra tabla.

Dejar respuesta

Please enter your comment!
Please enter your name here