2012-02-14 29 views
0

我在其他網站(和這裏)上問了幾次,但我想我會再試一次,因爲我真的沒有找到答案。我很喜歡hibernate,而且我很害怕在hibernate的論壇上發帖。我主要使用Hibernate 3.6的JPA註釋。如何使用鑑別器/繼承來管理沒有表的空實體和/或實體

我有以下模式: Schema

所以基本上這是一個傳統的DB。提名是中央表,我有4種特定類型的提名:

  1. 同事(僅使用NOMINATION表列作爲屬性)
  2. 小組(NOMINATION + TEAM_NOM表)
  3. 理念(NOMINATION + IDEA_NOM表)
  4. 成功(提名+ SUCCESS_NOM表)

所以我所做的就是用一個鑑別(和繼承),以建立自己的實體。例如:

這裏的實體提名:

@Entity(name = "Nomination") 
    @Table(name = "NOMINATION") 
    @DiscriminatorColumn(name="CATEGORY_CODE", discriminatorType = DiscriminatorType.STRING, length = 1) 
    @Inheritance(strategy=InheritanceType.JOINED) 

    public abstract class Nomination extends AuditableEntity { 

而這裏的我是如何編碼的團隊,理念和成功的實體:

@Entity(name = "TeamNom") 
    @Table(name = "TEAM_NOM") 
    @DiscriminatorValue("T") 
    @PrimaryKeyJoinColumn(name = "NOM_ID") 

    public class TeamNom extends Nomination { 

現在的同事,我做了以下內容:

@Entity(name = "CoworkerNom") 
    @DiscriminatorValue("C") 
    @PrimaryKeyJoinColumn(name = "NOM_ID") 

    public class CoworkerNom extends Nomination { 

正如你所看到的,我有一個很大的問題。 Hibernate正在尋找名爲「CoworkerNom」的表,但我沒有任何數據庫。我試圖將「提名」列爲表格,因爲我的想法不合理,但從邏輯上講,它給了我一個循環依賴的錯誤。

那麼我該如何處理這個沒有表格和沒有屬性的實體呢?其他實體顯然工作得很好。

+1

它看起來像我在你的域類中混入你的dao類。 CoworkerNom不是一張桌子,所以爲什麼要嘗試繪製它?可能有辦法做你想做的事,但我不確定。您可以讓提名爲具體類,並創建一個數據庫視圖名稱CoworkerNom,它只是從提名中選擇*,然後像上面那樣映射它,然後將實體名稱更改爲視圖的名稱。 – 2012-02-14 21:12:01

+0

我討論過這個問題,還考慮製作一張名爲Coworker的表格,並僅在其上傾銷ID。這是一個有趣的解決方案,但我寧願通過Hibernate來解決這個問題。無論哪種方式感謝答覆,我會考慮它。 – Nimchip 2012-02-14 21:22:18

回答

1

在冬眠你將不得不創建一個具有提名的每個子類屬性的表,所以你要在實踐中有此表只填充了ID的......這背後,我認爲的理由是,這樣你有一個好處,就是如果你想在未來擴展這個具有特定屬性的子類,你可以在沒有太多註釋或模式改變的情況下這樣做。