Me está resultando muy difícil tratar de conseguir una relación unidireccional uno-a-uno para trabajar con JPA (Proveedor: Hibernate). En mi opinión esto no debería ser una molestia, pero aparentemente JPA/Hibernate no está de acuerdo con eso ;-)Mapeo unidireccional unificado JPA/Hibernate con clave primaria compartida
El problema es que tengo que mapear un esquema heredado que no puedo cambiar y que este esquema usa un primario compartido clave entre dos entidades que al mismo tiempo es la clave externa para una entidad.
he creado un TestCase simple:
DB se ve de la siguiente manera:
CREATE TABLE PARENT (PARENT_ID Number primary key, Message varchar2(50));
CREATE TABLE CHILD (CHILD_ID Number primary key, Message varchar2(50),
CONSTRAINT FK_PARENT_ID FOREIGN KEY (CHILD_ID)REFERENCES PARENT (PARENT_ID));
CREATE SEQUENCE SEQ_PK_PARENT START WITH 1 INCREMENT BY 1 ORDER;
El padre (= poseer lado de uno-a-uno) es el siguiente:
@Entity
@Table(name = "PARENT")
public class Parent implements java.io.Serializable {
private Long parentId;
private String message;
private Child child;
@Id
@Column(name = "PARENT_ID", unique = true, nullable = false, precision = 22, scale = 0)
@SequenceGenerator(name="pk_sequence", sequenceName="SEQ_PK_PARENT")
@GeneratedValue(generator="pk_sequence", strategy=GenerationType.SEQUENCE)
public Long getParentId() {
return this.parentId;
}
public void setParentId(Long parentId) {
this.parentId = parentId;
}
@Column(name = "MESSAGE", length = 50)
public String getMessage() {
return this.message;
}
public void setMessage(String message) {
this.message = message;
}
@OneToOne (cascade = CascadeType.ALL)
@PrimaryKeyJoinColumn(name="PARENT_ID", referencedColumnName="CHILD_ID")
public Child getTestOneToOneChild() {
return this.child;
}
public void setTestOneToOneChild(Child child) {
this.child = child;
}
}
El niño:
@Entity
@Table(name = "TEST_ONE_TO_ONE_CHILD", schema = "EXTUSER")
public class Child implements java.io.Serializable {
private static final long serialVersionUID = 1L;
private Long childId;
private String message;
public Child() {
}
public Child(String message) {
this.message = message;
}
@Id
@Column(name = "CHILD_ID")
public Long getChildId() {
return this.childId;
}
public void setChildId(Long childId) {
this.childId = childId;
}
@Column(name = "MESSAGE", length = 50)
public String getMessage() {
return this.message;
}
public void setMessage(String message) {
this.message = message;
}
}
Veo por completo el problema de que JPA no sabe cómo asignar la identificación para el niño. Sin embargo, también intenté usar el Generador de claves "extranjeras" de Hibernates sin éxito, porque es necesario que haya una referencia a los padres del niño que no es deseable. Este problema no me parece muy raro, entonces, ¿qué es lo que me falta aquí? ¿Hay alguna solución? También puedo usar extensiones de hibernación si el JPA puro no proporciona una solución.
Mis expectativas para un comportamiento correcto sería: Si trato de persistir el padre con un niño que se adjunta: Identificación
- obtener de secuencia, la puso sobre el padre
- persisten los padres
- Identificación conjunto de los padres sobre los niños
- persisten niño
Si trato que persista un "independiente" niño (p. entityManager.persist (aChild)) Esperaría una RuntimeException.
¡Cualquier ayuda es muy apreciada!
No lo he intentado, pero tal vez funcione porque ha puesto anotaciones en getters, lo que debería indicarle a Hibernate que llene sus POJO usando setters. Podría tratar de establecer la identificación del niño en los métodos setParentId() y setChild() (si aún no tiene uno). –
No, eso no funciona: IdentifierGenerationException: IDs de esta categoría deberán ser asignados manualmente antes de llamar a save() – Korgen
¿Qué versión de Hibernate utiliza? – axtavt