2012-04-09 9 views
11

Estoy usandopara JPA. Tengo una entidad que tiene una clave compuesta fabricada en dos campos. A continuación está mi incrustable campos de clase de clave primaria (miembros).Asignación de clave externa dentro de clase incrustable

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

Mi entidad se va a celebrar dejar los datos relacionados con un personal, así que trato de combinar objeto personal y la fecha de dejar de producir clave compuesta. Aparte de mi lógica, no me permite tener una asignación de clave externa dentro de la clase incrustable. Cuando trato de usar herramientas JPA -> Generar tablas desde la entidad, se produce un error como el siguiente, lo que explica, pero no lo estoy obteniendo.

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. 

Qué significa, no puedo tener una clave (de clave compuesta) que también es una clave externa. ¿Hay alguna manera alternativa de lograr este ERM? Por favor ayuda. Gracias

Respuesta

12

No coloque relaciones en las clases de ID, ni para @IdClass ni . Una clase @Embeddable solo puede incluir las anotaciones @Basic, @Column, @Temporal, @Enumerated, @Lob o @Embedded. Todo lo demás es sintaxis específica del proveedor (por ejemplo, Hibernate lo permite, pero como estás utilizando EclipseLink, que es el JPA RI, dudo que sea esto lo que quieres).

Aquí está un ejemplo JPA PK/FK mapeo:

@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

Cuestiones relacionadas