14

に使用eclipselinkしていJPAます。2 つのフィールドから作成された複合キーを持つエンティティがあります。以下は、埋め込み可能な主キー クラスのフィールド (メンバー) です。

    @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ツールを使用しようとすると-> Generate Tables From Entity 、以下のようなエラーが発生しますが、これは説明していますが、取得できません。

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 を達成する別の方法はありますか? 助けてください。ありがとう

4

1 に答える 1

18

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

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

于 2012-04-10T04:31:20.290 に答える