2013-03-19 38 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的子类索引为它们的不合格的名称,并且从公式返回的值因此与我提供的任何类定义都不匹配。