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