gpt4 book ai didi

eclipse - 为什么这个 JPA 2.0 映射在 Eclipse/JBoss 工具中给我一个错误?

转载 作者:行者123 更新时间:2023-12-04 06:28:05 24 4
gpt4 key购买 nike

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

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

验证消息:
“匹配ID类属性country的属性没有正确的类型java.lang.String”
  • 为什么这是错误的 JPA 2.0 语法(参见 Zip.country 上的 @Id 注释)?我不认为是。毕竟 Zip.country 和 ZipId.country 的类型 不能 JPA 2 相同,因为 @ManyToOne 上的 @Id 注释和 PK 是一个简单的整数,它成为 ID 类对应物。任何人都可以检查/确认这一点吗?
  • 这可能是一个错误,可能在 JBoss 工具中吗? (哪个软件组件报告了上述错误?将 3 个表和实体类放入新的 JavaSE 项目时,没有错误显示确切代码...)
  • 最佳答案

    回答自己的问题...

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

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

    个人补充:

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

    关于eclipse - 为什么这个 JPA 2.0 映射在 Eclipse/JBoss 工具中给我一个错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5784272/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com