1

我在 Jboss7 环境和 Postgres9 数据库中使用 Hibernate4.1 作为后端。我有一张名为documents. 它看起来像这样:

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列而不需要添加另一列,我更愿意“自然地”表达这一点。

content我可能应该补充一点,如果文档可以被解析或 OCR化,“文件支持”的文档仍然可以是非空的。

4

1 回答 1

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 (如在Hibernate 中: org.hibernate.WrongClassException, SINGLE_TABLE 继承和 DiscriminatorFormula),但那是我误认为Hibernate 手册说:

如果您未在类上设置 @DiscriminatorValue,则使用完全限定的类名。

所以我原本有

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

注意完全限定的类名。但是,HibernateDocument使用其非限定名称索引 的子类,因此从公式返回的值与我提供的任何类定义都不匹配。

于 2013-03-27T14:51:58.500 回答