1

Jboss7 環境で Hibernate4.1 を使用し、Postgres9 データベースをバックエンドとして使用しています。という名前のテーブルが 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実際のテーブル/エンティティはやや大きく、エンティティには、ファイル (非空) または文字列のみ (非空)によってサポートされているかどうかに基づいて、一連のロジックが関連付けられていますcontentFileDocumentファイル処理を、から拡張されるという名前の別のエンティティに分割したいと考えています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!"
  }
}

唯一のつまずき点はWrongClassExceptionHibernateからのものでした(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"

完全修飾クラス名に注意してください。ただし、Hibernate は修飾Documentされていない名前で のサブクラスにインデックスを付けていたため、式から返された値は、提供したクラス定義と一致しませんでした。

于 2013-03-27T14:51:58.500 に答える