2012-04-09 17 views
11

Sto utilizzando eclipselink per JPA. Ho un'entità, che ha una chiave composita fabbricata su due campi. Di seguito sono riportati i miei campi Embeddable primary key (membri).Mappatura chiavi esterne all'interno della classe incorporabile

@Embeddable 
    public class LeavePK { 
     @ManyToOne(optional = false) 
     @JoinColumn(name = "staffId", nullable = false) 
     private Staff staff; 
     @Temporal(TemporalType.TIMESTAMP) 
     private Calendar date; 
     //setters and getters 
    } 

mio entità sta per tenere lasciare i dati relativi ad uno staff, quindi sto cercando di coniugare oggetto personale e data di lasciare per la produzione di chiave composta. A parte la mia logica, non mi permette di avere una mappatura di chiavi estranee all'interno di una classe incorporabile. Quando provo a usare gli strumenti JPA -> Genera tabelle dall'entità, dà errore come di seguito, il che spiega, ma non lo capisco.

org.eclipse.persistence.exceptions.ValidationException 
Exception Description: The mapping [staff] from the embedded ID class [class rs.stapp.entity.LeavePK] is an invalid mapping for this class. An embeddable class that is used with an embedded ID specification (attribute [leavePK] from the source [class rs.stapp.entity.Leave]) can only contain basic mappings. Either remove the non basic mapping or change the embedded ID specification on the source to be embedded. 

Significa che non posso avere una chiave (dalla chiave composita) che è anche una chiave esterna. Esiste un modo alternativo per realizzare questo ERM? Per favore aiuto. Grazie

risposta

12

Non inserire relazioni nelle classi ID, né per @IdClass o @EmbeddedId. Una classe @Embeddable può includere solo le annotazioni @Basic, @Column, @Temporal, @Enumerated, @Lob o @Embedded. Tutto il resto è sintassi specifica del provider (ad esempio, Hibernate lo consente, ma dal momento che stai utilizzando EclipseLink, che è il RI di JPA, dubito che questo sia ciò che desideri).

Ecco un esempio JPA PK/FK mappatura:

@Entity 
@Table(name = "Zips") 
public class Zip implements Serializable 
{ 
    @EmbeddedId 
    private ZipId embeddedId; 

    @ManyToOne 
    @JoinColumn(name = "country_code", referencedColumnName = "iso_code") 
    private Country country = null; 

    ... 
} 

@Embeddable 
public class ZipId implements Serializable 
{ 
    @Column(name = "country_code") 
    private String countryCode; 

    @Column(name = "code") 
    private String code; 

    ... 
} 

HTH