【问题标题】:Hibernate Inheritance Mapping and Attribute OverrideHibernate 继承映射和属性覆盖
【发布时间】:2009-10-13 04:24:14
【问题描述】:

我正在处理的系统有一个名为 Order 的域对象,它继承自 AbstractPersistentObject。现在我需要添加另一个名为 ExternalOrder 的域对象,它具有 Order 的一些属性,但不是全部。我希望在某些地方对这两个对象进行多态处理。因此,我正在考虑实现继承映射。

我创建了一个AbstractOrder,它现在扩展了AbstractPersistentObject 并将通用属性移到了AbstractOrder。 Order 和 ExternalOrder 现在扩展了 AbstractOrder。

由于 Order 表在数据库中已经有大量数据,我不希望对架构进行太多更改。

  1. 如果我省略 InheritanceType.SINGLE_TABLE,哪种继承策略更适合我?我应该提到我必须使用 OnetoMany 加入至少一个域对象。域对象将引用 AbstractOrder,Hibernate 将在运行时决定此 AbstractOrder 的具体子类。

  2. AbstractPersistentObject 具有属性 ID 的 @Id 和 @GeneratedValue(strategy=GenerationType.IDENTITY)。当我实现继承时,有没有办法覆盖它?据我了解, GenerationType.IDENTITY 不适用于某些继承选择,我不确定如何覆盖它。我已经查看了 @AttributeOverride,但我认为它仅在您想要覆盖某些 @Column 值时才有用。

【问题讨论】:

    标签: java hibernate persistence annotations


    【解决方案1】:

    1) 你在这里真的没有太多选择。另外两个继承映射策略是 table per class 对您不起作用(因为它不支持 IDENTITY)和 joined subclasses 这将要求您将“订单”表分成两个(AbstractOrder 和 Order)并添加另一个ExternalOrder 表。

    2) 您不能在继承层次结构中覆盖 id 上的属性。不过这样也好,table-per-class 策略绝对不理想。

    【讨论】: