Hibernate继承映射和属性覆盖

时间:2009-10-13 04:24:14

标签: java hibernate persistence annotations

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

我创建了一个 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值时它才有用。

1 个答案:

答案 0 :(得分:1)

1)你这里没有太多的选择。另外两个继承映射策略是table per class,它不适合你(因为它不支持IDENTITY)和joined subclasses,它们要求你将“Orders”表分成两个(AbstractOrder和Order) )另外为ExternalOrder添加另一个表。

2)您不能覆盖继承层次结构中的id上的属性。尽管如此,每个班级的策略绝对不是理想的。