2

私は次のような状況です: (ソース: kawoolutions.com )有効な XHTML

JPA 2.0 マッピング (エラーの原因は Zip および ZipId クラスのみであると考えられるため、おそらく十分である可能性があります):

@Entity
@Table(name = "GeoAreas")
@Inheritance(strategy = InheritanceType.JOINED)
@DiscriminatorColumn(name = "discriminator", discriminatorType = DiscriminatorType.STRING)
public abstract class GeoArea implements Serializable
{
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    protected Integer id;

    @Column(name = "name")
    protected String name;

    ...
}

@Entity
@Table(name = "Countries")
@DiscriminatorValue(value = "country")
public class Country extends GeoArea
{
    @Column(name = "iso_code")
    private String isoCode;

    @Column(name = "iso_nbr")
    private String isoNbr;

    @Column(name = "dial_code")
    private Integer dialCode = null;

    ...
}

@Entity
@Table(name = "Zips")
@IdClass(value = ZipId.class)
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;

    ...
}

public class ZipId implements Serializable
{
    private String country;

    private String code;

    ...
}

非常にシンプルなデザイン:

国は地域であり、ルート クラスから ID を継承します。郵便番号は国内で一意であるため、ISO コードと実際の郵便番号を PK として組み合わせます。したがって、Zip は Countries.iso_code を参照します。このコードには、代替の一意の非 null キーがあります (非主キー列への参照!)。Zip.country アソシエーションは @Id アノテーションを取得し、その変数名はその ID クラス ZipId のものと同じです。

ただし、Eclipse内から次のエラーメッセージが表示されます(JBossツールも使用):

検証メッセージ: 「ID クラス属性 country に一致する属性のタイプが正しくありません java.lang.String」

  1. JPA 2.0構文でこれが間違っているのはなぜですか(Zip.country の @Id アノテーションを参照)。そうではないと思います。結局、Zip.country と ZipId.country のすべてのタイプは、@ManyToOneの @Id アノテーションと ID クラスの対応物となる単純な整数である PK のため、JPA 2 で同じにすることはできません。誰でもこれを確認/確認できますか?
  2. これは、おそらく JBoss Tools のバグでしょうか? (上記のバグを報告しているソフトウェア コンポーネントはどれですか? 3 つのテーブルとエンティティ クラスを新しい JavaSE プロジェクトに配置すると、正確なコードでエラーが表示されません...)
4

3 に答える 3

2

自分の質問に答える...

参照をモデル化する方法では、FKがCHAR(2)であるCountriesテーブルのiso_code列を指しているため、文字列を使用します。したがって、基本的に私のマッピングは正しいです。ただし、問題は、JPA2.0では主キー列への参照以外は許可されないことです。これは、EclipseDaliJPAバリデーターが示すものです。

Keith /Schincariolによる「ProJPA2.0」p.283トップ「派生識別子の基本ルール」(ルール#6)からの抜粋:「エンティティのid属性がリレーションシップの場合、一致する属性のタイプidクラスは、リレーションシップ内のターゲットエンティティの主キータイプと同じタイプです(主キータイプが単純タイプ、IDクラス、または埋め込みIDクラスのいずれであるか)。」

個人的な補遺:

この制限があるJPA2.0には同意しません。JPA 1.0マッピングでは、PK以外の列への参照が可能です。代わりにJPA1.0マッピングを使用することは、私が探しているものではないことに注意してください。この制限がJPA2.0に課された理由に興味があります。JPA2.0は間違いなく制限的です。

于 2011-04-29T08:03:06.940 に答える
1

CompoundIdentity の関係に注目してください。この質問と私の回答を参照してください JPA 2.0で複合外部キーをマッピングするのに役立ちます

あなたの場合、ZipIdには「国」フィールドがありません

于 2011-04-28T15:09:35.560 に答える
0

私はあなたのコードをテストしていませんが、 @PrimareKeyJoinColumn アノテーションの使用にかなり関連しているようです。

セクション 11.1.40 の JPA 2.0 仕様では、次のように述べられています。

PrimaryKeyJoinColumn アノテーションは、JOINED マッピング戦略でエンティティ サブクラスのプライマリ テーブルをそのスーパークラスのプライマリ テーブルに結合するために使用されます。セカンダリ テーブルをプライマリ テーブルに結合するために、SecondaryTable アノテーション内で使用されます。また、参照エンティティの主キーが参照エンティティへの外部キーとして使用されるOneToOneマッピングで使用される場合があります[108]。

仕様の例は、あなたのケースのように見えます。

@Entity
@Table(name="CUST")
@Inheritance(strategy=JOINED)
@DiscriminatorValue("CUST")
public class Customer { ... }

@Entity
@Table(name="VCUST")
@DiscriminatorValue("VCUST")
@PrimaryKeyJoinColumn(name="CUST_ID")
public class ValuedCustomer extends Customer { ... }

それが役立つことを願っています!

于 2011-04-25T23:43:44.670 に答える