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 Basic
Id
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 elJOINED
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 unOneToOne
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
Utilizar JoinColumn
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.