web-dev-qa-db-ja.com

JPA仕様では、非主キー列への参照が許可されていますか?

JPA仕様では、非主キー列への単純な参照が許可されていますか?

参照で使用したいCountriesテーブルに単純な代替/自然キー(UNIQUE、NOT NULL)列iso_codeがありますが、EclipseのDaliが検証エラーを示し、HibernateがMappingExceptionをスローします。

そのような一般的なシナリオは許可されていますか?

18
Kawu

@axtavt:あなたの答えが正しくなかったかのように見えます。 「ProJPA2.0」の作者から、JPA仕様にも取り組んでいるメールが届きました。

「あなたの例では、Zipクラスは国と関係があります。

public class Zip implements Serializable
{
    @Id
    @Column(name = "code")
    private String code;

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

これは、country_code外部キー列を、PKではないCountryテーブルのiso_code列にポイントしようとしているようです。 JPAでは、このような関係の作成は許可されていません国のPKを指定しないと、関係にある国のインスタンスを一意に識別する方法がないためです。派生した識別子の部分に到達したときに問題が発生しているだけですが、問題は無効な関係自体にあるようです。」

したがって、JPA仕様では、PK以外の列への関係/ FKはまったく許可されていません...

9
Kawu

非PK列を参照する関係のサポートはオプション機能です。単純なケースでは、Hibernateでサポートされていますが、派生IDの一部として使用することはできません。

ただし、IDを取得しない限り(つまり、主キーコンポーネントの値を手動で設定できる場合)、次のような読み取り専用のマッピングを試すことができます。

@Entity
@Table(name = "Zips")
@IdClass(value = ZipId.class)
public class Zip implements Serializable
{
    @Id
    @Column(name = "code")
    private String code;

    @Id
    @Column(name = "country_code")
    private String countryCode; // Primary key component should be set manually

    @ManyToOne
    @JoinColumn(name = "country_code", referencedColumnName = "iso_code", 
        insertable = false, updateable = false)
    private Country country = null; // Read-only relationship based on a value 
                                    // of primary key component

    ...
}
7
axtavt