2011-04-19 18 views
5

Soy nuevo en APP y yo estoy tratando de asignar una base de datos existente. Los archivos se cargan correctamente individualmente pero las relaciones no funcionan correctamente. Cualquier ayuda sería apreciada.asignación de una clave externa compuesta en JPA 2.0

Java

@Entity 
@IdClass(ParentKey.class) 
public class Parent { 
    @Id 
    @Column(name="code") 
    private String code; 

    @Id 
    @Column(name="id") 
    private int id; 

    @OneToMany(mappedBy="parent") 
    private List<Child> children = new ArrayList<Child>(); 
} 

public class ParentKey { 
    private String code; 
    private int id; 
} 

@Entity 
@IdClass(ChildKey.class) 
public class Child { 
    @Id 
    @JoinColumns({ 
     @JoinColumn(name="code") 
     @JoinColumn(name="id") 
    }) 
    private Parent parent; 

    @Id 
    @Column(name="index") 
    private int index; 
} 

public class ChildKey { 
    private String code; 
    private int id; 
    private int index; 
} 

SQL

create table Parent(
    code char(4) not null, 
    id int not null, 
    primary key(code,id) 
); 

create table Child(
    code char(4) not null, 
    id int not null, 
    index int not null, 
    primary key(code, id, index), 
    foreign key(code, id) references Parent(code,id) 
); 

edición 1: añadir las clases ChildKey y ParentKey.

Respuesta

2

Aquí hay un enlace a docs DataNucleus para la identidad compuesto relación 1-N. Puede ayudarlo a identificar lo que está mal. Para empezar no tienes IdClass define en Niño

http://www.datanucleus.org/products/accessplatform_3_0/jpa/orm/compound_identity.html#1_N_coll_bi

+0

me olvidó añadir los @IdClass a mi ejemplo la primera vez, pero ahora se ha corregido. Gracias por el enlace, pero no tiene un ejemplo de clave principal que incluya una clave externa. Necesito un ejemplo más complejo que represente la relación dada en el ejemplo anterior. –

+0

Sí lo hace. Address.PK tiene Account como parte de su PK. Su ChildKey es incorrecta – DataNucleus

+0

Tiene razón; No lo vi cuando lo leí. Terminé usando la herramienta de mapeo inverso de OpenJPA y me dio la solución. Gracias por tu ayuda. –

2

Esto es lo que OpenJPA creado usando su herramienta ReverseMapping y parece estar funcionando correctamente.

@Entity 
@Table(name="PARENT") 
@IdClass(ParentId.class) 
public class Parent { 
    @OneToMany(targetEntity=Child.class, mappedBy="parent", cascade=CascadeType.MERGE) 
    private Set childs = new HashSet(); 

    @Id 
    @Column(length=4) 
    private String code; 

    @Id 
    private int id; 

    //omitted getters, setters 
} 

public class ParentId implements Serializable { 
    public String code; 
    public int id; 

    //omitted getters, setters, toString, equals, hashcode 
} 

@Entity 
@Table(name="CHILD") 
@IdClass(ChildId.class) 
public class Child { 
    @Id 
    @Column(length=4) 
    private String code; 

    @Id 
    private int id; 

    @Id 
    private int index; 

    @ManyToOne(fetch=FetchType.LAZY, cascade=CascadeType.MERGE) 
    @JoinColumns({@JoinColumn(name="code"), @JoinColumn(name="id")}) 
    private Parent parent; 

    //omitted getters, setters 
} 

public class ChildId implements Serializable { 
    public String code; 
    public int id; 
    public int index; 

    //omitted getters, setters, toString, equals, hashcode 
} 
Cuestiones relacionadas