我有以下情况:(
来源: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 注释)?我不认为它是。毕竟对于 JPA 2,Zip.country 和 ZipId.country 的所有类型不能相同,因为 @ManyToOne 上的 @Id 注释和 PK 是一个简单的整数,它成为 ID 类对应项。任何人都可以检查/确认这一点吗?
- 这可能是一个错误,可能在 JBoss 工具中吗?(哪个软件组件报告了上述错误?将 3 个表和实体类放入新的 JavaSE 项目时,没有显示错误的确切代码......)