【问题标题】:JPA: is it possible to change the PKs in an inheritance hierarchy?JPA:是否可以更改继承层次结构中的 PK?
【发布时间】:2011-08-10 07:56:40
【问题描述】:

我有以下数据库设计:


(来源:kawoolutions.com

如您所见,States、Countrys 和 Continents 都是 GeoAreas 的子表。这里有趣的事实是,States 和 Country 更改了它们的主键,而不是(据说)从 GeoAreas 继承的主键。

目的:州和国家也用于邮政地址,我不想为此使用 GeoAreas.id(未显示对州和国家的引用)。

问题是: JPA 支持这样的设计吗?仅 JPA 2.0?完全没有?

我看到的问题是 @Id 注释(用于所有映射)将如何指定为 GeoArea 类看起来像

public abstract class GeoArea implements Serializable
{
    @Id
    @Column(name = "id")
    protected Integer id;

    ...
}

子类还需要在某些属性上指定另一个替代@Id,例如

public class Country extends GeoArea
{
    @Id
    @Column(name = "iso_code")
    private String isoCode;

    ...
}

谁能指出我拒绝这种情况的 JPA 规范?

【问题讨论】:

    标签: hibernate inheritance jpa mapping primary-key


    【解决方案1】:

    第 2.4 节

    主键必须在作为根的实体类上定义 实体层次结构或映射的超类是(直接或 间接)实体层次结构中所有实体类的超类。这 主键必须在实体层次结构中只定义一次。

    即您不能在子类中“重新定义”身份(通过向身份添加额外的字段)。

    【讨论】:

    • 谢谢!所以这意味着任何子表都必须定义与根表和其间所有超级表的识别关系? (只是为了让自己放心......)
    猜你喜欢
    • 1970-01-01
    • 2010-12-21
    • 2014-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-16
    • 1970-01-01
    相关资源
    最近更新 更多