2012-06-15 76 views
1

我在MySQL數據庫中有多個表。比方說,就像這樣:Hibernate註解和繼承

  • 書:

    title, subject, publisher, book_author 
    
  • 日報:

    title, subject, publisher, journal_name 
    
  • 博客:

    title, subject, website, blog_author 
    
  • 電子報:

    title, subject, website, news_paper_name 
    

具體結構無關的問題。實際上,所有表格共有大約20列,而對於少數或僅一個表格而言,這些列是獨一無二的。關鍵是,他們都分享一些專欄。我想使用Hibernate來訪問這些,使用帶註釋的類。我不想擁有5個以上的類,每個類都有20多個冗餘字段,每個類都有一個訪問器和增變器。我想一個階級結構是這樣的:

  • 抽象Publication {標題,主題}
    • 抽象PrintPublication {出版商}
      • Book {:BOOK_AUTHOR}
      • Journal {JOURNAL_NAME}
    • 抽象Online Publicaiton {網站}
      • Blog {blog_author}
      • ENews {news_paper_name}

但是,我不能爲了我的生活找出如何得到這個工作。每個具體類都是數據庫中的單個表。我認爲解決方案將是每個班級的表格(@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)),但是會引發一些有趣的錯誤。

什麼是適合所有這一切的解決方案?除了改變表格結構。該數據庫不是我的,我沒有被賦予改變它的權利。

回答

3

如果不需要實體之間的類型繼承,爲此目的有MappedSuperClass。想法是,你定義了所有常用的持久化屬性及其在映射超類中的映射,實體將擴展它。

結果是映射將應用於擴展映射超類的實體,但從持久性的角度來看,並不存在實體和映射超類之間的關係。

下面提供了起點:

@MappedSuperclass 
public class Publication { 
    String title; 
    @Column (name="subject_of_publication") 
    String subject; 

    ... 
} 

@MappedSuperclass 
public class PrintPublication extends Publication { 
    String publisher; 
    ... 
} 

@Entity 
public class Book extends PrintPublication {//inherits persistent attributes 
    ... 
    String author; 
} 

您也可以映射超在實體層次結構其他級別,並根據需要覆蓋的實體映射。

但是,如果您在某種程度上威脅到Book和Blog作爲一種類型的威脅,那麼映射的超類無法走,因爲您無法查詢它。

+0

絕對適合我的情況。非常感謝 :) –