hibernate - que - ¿La especificación JPA permite referencias a columnas de clave no primaria?
anotaciones @column (2)
@axtavt: Parece que tu respuesta no fue correcta. Acabo de recibir un correo electrónico de los autores de "Pro JPA 2.0", que también estaban trabajando en las especificaciones de JPA.
"En su ejemplo, la clase Zip tiene una relación con un país:
public class Zip implements Serializable
{
@Id
@Column(name = "code")
private String code;
@Id
@ManyToOne
@JoinColumn(name = "country_code", referencedColumnName = "iso_code")
private Country country = null;
...
}
Esto parece estar intentando apuntar la columna de clave foránea country_code a la columna iso_code en la tabla País, que no es un PK. JPA nunca le ha permitido crear una relación como esta porque, sin especificar la PK del país, no habría manera de identificar de forma única qué instancia de país está en la relación. Simplemente estás golpeando el problema cuando llegas a la parte del identificador derivado, pero el problema parece estar en la propia relación no válida ".
Así que la especificación JPA no permite relaciones / FK a columnas que no sean PK en absoluto ...
¿La especificación JPA permite referencias simples a columnas de clave no primaria?
Tengo una columna alternativa / clave natural (ÚNICA, NO NULA) iso_code en mi tabla de Países que me gustaría usar en una referencia, pero Dali de Eclipse muestra un error de validación y Hibernate lanza una excepción de Mapping.
¿Se permite tal escenario común?
El soporte de relaciones que hacen referencia a columnas que no son de PK es una característica opcional. En casos simples, es compatible con Hibernate, pero no se puede utilizar como parte de la identidad derviada.
Sin embargo, siempre que no derive una identidad (es decir, si puede establecer un valor del componente de clave principal manualmente), puede intentar jugar con asignaciones de solo lectura, algo como esto:
@Entity
@Table(name = "Zips")
@IdClass(value = ZipId.class)
public class Zip implements Serializable
{
@Id
@Column(name = "code")
private String code;
@Id
@Column(name = "country_code")
private String countryCode; // Primary key component should be set manually
@ManyToOne
@JoinColumn(name = "country_code", referencedColumnName = "iso_code",
insertable = false, updateable = false)
private Country country = null; // Read-only relationship based on a value
// of primary key component
...
}