2012-04-09 12 views
11

JPAeclipselinkを使用しています。私は複合キーを2つのフィールドから作成したエンティティを持っています。以下は私の埋め込み可能プライマリキークラスのフィールド(メンバ)です。Embeddableクラス内での外部キーマッピング

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

私のエンティティはスタッフに関する離脱データを保持する予定なので、私はスタッフオブジェクトを結合し、複合キーを生成するために日付を残そうとしています。私のロジックとは別に、埋め込み可能なクラス内に外部キーマッピングを持たせることはできません。 JPAツール - >エンティティからテーブルを生成を使用しようとすると、以下のようにエラーが表示されますが、私はそれを取得していません。

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. 

つまり、私は外部キーであるキー(複合キーから)を持つことはできません。このERMを達成する別の方法はありますか?助けてください。ありがとう

答えて

12

IDクラスには、@IdClassまたは@EmbeddedIdのいずれの関係も入れないでください。 @Embeddableクラスは、@Basic,@Column,@Temporal,@Enumerated,@Lobまたは@Embeddedのアノテーションのみを含むことができます。他のすべてがプロバイダ固有の構文です(たとえば、Hibernateがこれを許可しますが、JPA RIであるEclipseLinkを使用しているので、これはあなたが望むものではありません)。

ここでは一例JPA PK/FKマッピングがあります:

@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

関連する問題