2011-04-21 63 views
0

使用Hibernate,我試圖實現一個固定域類型A和另一個類型爲B的域類型B之間的一對一關係任何實現某個接口的類型。使用Hibernate的一種類型和另一種類型的子類之間的一對一關係

情況:

的系統具有三個不同的域類型;國家,倉庫和商店,它們實現了接口FlagSubscriber。

我想加入FlagSubscribers與標誌。每個Flag可以與0或1個FlagSubscribers配對。

實現:

在我爲國家,倉庫,商店和標誌表,每個都有一個ID列和各種其他列的特定屬性數據庫。爲了配對FlagSubscribers標誌我創建了一個鏈接表看起來像這樣:

  • FLAG_ID
  • subscriber_id
  • subscriber_type

ID字段是不言自明的subscriber_type是確定subscriber_id是否與國家,倉庫或商店相關的文本字段。

問:

使用Hibernate註解,我怎麼告訴Hibernate如何在旗類映射FlagSubscribers?

我想我需要使用鑑別器,但我不完全確定如何爲我的具體情況做到這一點,或者即使這是可能的。

任何指向示例,建議或想法的指針都會受到歡迎!

+0

那麼,一個Flag有FlagSubscribers,可以是國家,倉庫或商店? – 2011-04-21 10:57:57

+0

@TheStijn是的,確切地說。 – SlappyTheFish 2011-04-21 15:03:20

回答

1

也許它可以使用@Any annotation映射,但我不知道它將如何與鏈接表一起玩。但是,由於FlagFlagSubscriber之間的關係是一對一的關係,因此您可以將其映射爲無鏈接表。

另請注意,如果通過EntityManager接口使用Hibernate,它將無法工作,因爲Hibernate 3.5。

+0

謝謝 - 從示例中看,這幾乎完全是我想要的。我的情況的主要區別在於,鏈接對象的類型和ID存儲在外部表中,所以我很難鏈接,但我不知道如何。 – SlappyTheFish 2011-04-21 12:30:10

+0

@SlappyTheFish:你看過了,如果你在示例中添加了@ @TableTable,會發生什麼?除此之外,您始終可以將鏈接表建模爲單獨的實體。 – axtavt 2011-04-21 12:43:54

+0

最後,我將subscriber_id和subscriber_type列合併到了Flag表格中,然後刪除了FlagSubscribers表格,這樣您發佈的鏈接中的示例就完美了 - 謝謝!關於鏈接,我發現這個答案http://stackoverflow.com/questions/217831/how-to-use-hibernate-any-related-annotations/217880#217880看起來好像它應該工作。 – SlappyTheFish 2011-04-21 15:01:51

0

我會去另一個設置:

無接口FlagSubscriber但3個subsclasses的(抽象)類:商店,倉庫和國家。所有常見字段可能會被移動到FlagSubscriber,但我認爲這可能被限制爲

@ManyToOne private flag flag;

然後,您可以選擇有一個單獨的表FlagSubscriber,它將包含subscriber_id和表標誌的外鍵。 FlagSubscriber的每個子類也將擁有它自己的具有相同ID的表。不需要鑑別器,因爲hibernate會和所有的子類一起知道它實際是哪個類型(子類)(在id上它只能成功。