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。因此 Zips 引用了 Country.iso_code,它上面有一个替代的唯一非空键(引用非主键列!)。Zip.country 关联获得一个@Id 注释,其变量名称与其 ID 类 ZipId 中的变量名称相同。

但是,我从 Eclipse 中收到此错误消息(也使用 JBoss 工具):

验证消息:“与 ID 类属性 country 匹配的属性没有正确的 java.lang.String 类型”

  1. 为什么JPA 2.0语法中有此错误(请参阅 Zip.country 上的 @Id 注释)?我不认为它是。毕竟对于 JPA 2,Zip.country 和 ZipId.country 的所有类型不能相同,因为 @ManyToOne 上的 @Id 注释和 PK 是一个简单的整数,它成为 ID 类对应项。任何人都可以检查/确认这一点吗?
  2. 这可能是一个错误,可能在 JBoss 工具中吗?(哪个软件组件报告了上述错误?将 3 个表和实体类放入新的 JavaSE 项目时,没有显示错误的确切代码......)
4

3 回答 3

2

回答自己的问题...

我对引用建模的方式是使用字符串,因为 FK 指向国家表中的 iso_code 列,该列是 CHAR(2),所以基本上我的映射是正确的。但是,问题在于 JPA 2.0 只允许引用主键列。这就是 Eclipse Dali JPA 验证器显示的内容。

摘自 Keith/Schincariol 的“Pro JPA 2.0”第 283 页顶部,“派生标识符的基本规则”(规则 #6):“如果实体中的 id 属性是关系,则匹配属性的类型在id class 与关系中目标实体的主键类型相同(无论主键类型是简单类型、id 类还是嵌入的 id 类)。

个人补充:

我不同意 JPA 2.0 有这个限制。JPA 1.0 映射允许引用非 PK 列。请注意,使用 JPA 1.0 映射并不是我想要的。我宁愿对 JPA 2.0 施加此限制的原因感兴趣。JPA 2.0 绝对是有限制的。

于 2011-04-29T08:03:06.940 回答
1

我想说把你的注意力集中在 CompoundIdentity 关系上。看到这个问题,我的回答 是 Help Mapping a Composite Foreign Key in 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 回答