2009-10-13 104 views
0

我工作的系統中有一個名爲訂購AbstractPersistentObject繼承的域對象。現在我需要添加名爲ExternalOrder的另一個域對象,它具有Order的一些屬性,但不是全部。我希望這兩個對象在某些地方被處理爲polymorphically。因此我正在考慮實現繼承映射。Hibernate的繼承映射和屬性來覆蓋

我創建了一個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

1)在這裏你沒有太多選擇。其他兩種繼承映射策略是table per class,它不適用於您(因爲它不支持IDENTITY)和joined subclasses,這將要求您將「訂單」表拆分爲兩個(AbstractOrder和Order),併爲ExternalOrder添加另一個表。

2)您不能在繼承層次結構中覆蓋id上的屬性。但是,這種情況也是如此,但每班級的策略絕對不是理想的。