2013-03-19 40 views
1

我在Jboss7環境中使用Hibernate4.1,Postgres9數據庫作爲後端。我有一個名爲documents的表。它看起來像這樣:基於表列是非空/非空的,我可以繼承@Entity嗎?

CREATE TABLE documents (
    id serial primary key, 
    name varchar(255) not null, 
    path varchar(255) not null, 
    content text 
); 

現在我已經有一個名爲Document反映該表的實體:

@Entity 
public class Document { 
    @Id @GeneratedValue(strategy = IDENTITY) 
    Integer id; 
    @Column(nullable = false) 
    String name; 
    String path; 
    @Type(type = "text") 
    String content; 
} 

實際的表/實體有些做大實體有附加一堆邏輯它基於它是否由文件(非空path)或僅字符串(非空content)支持。我想將文件處理拆分爲一個名爲FileDocument的單獨實體,該實體將從Document延伸。 我可以用Hibernate來映射它嗎?如果是這樣,怎麼樣?

我寧願如果我可以使用單表繼承和基於path列來表示這個「自然」,而不需要添加另一列。

我應該補充說,如果文檔可以被解析或OCR,那麼「文件支持」文檔仍然可以有非空的content

+0

您是否檢查過MappedSuperClass註解? – fiso 2013-03-19 08:52:28

+0

是的,但我的理解是'@ MappedSuperClass'僅用於在實體之間共享公共屬性?在這種情況下,我的根'Document'類是一個完整的實體,它是我當前所有代碼查詢的實體(但有時它現在將獲得具有附加功能的子類)。 – mabi 2013-03-19 09:01:03

回答

0

已經比較直接的話,我想:

@Entity 
@DiscriminatorFormula("CASE WHEN path IS NULL OR path = '' THEN 'Document' ELSE 'FileDocument' END") 
public class Document { 
    @Id @GeneratedValue(strategy = IDENTITY) 
    Integer id; 
    @Column(nullable = false) 
    String name; 
    String path; 
    @Type(type = "text") 
    String content; 
} 

而且在FileDocument.groovy(是的,我混合Java和Groovy實體就好了)

@Entity 
class FileDocument extends Document { 
    def tellMe() { 
    "yes, sir!" 
    } 
} 

唯一的障礙點已經從一個WrongClassException休眠(像在Hibernate: org.hibernate.WrongClassException, SINGLE_TABLE inheritance and DiscriminatorFormula),但那是我誤認爲Hibernate Manual它說:

如果您未在類上設置@DiscriminatorValue,則使用完全限定的 類名稱。

所以我本來

@DiscriminatorFormula("CASE WHEN path IS NULL OR path = '' THEN 'com.mycompany.entity.Document' ELSE 'com.mycompany.entity.FileDocument' END" 

通知的完全限定類名。但是,Hibernate將Document的子類索引爲它們的不合格的名稱,並且從公式返回的值因此與我提供的任何類定義都不匹配。