ドキュメントの単純なJOINED階層があります。
CREATE TABLE Documents
(
id INTEGER NOT NULL,
discriminator ENUM('official','individual','external') NOT NULL,
file_name VARCHAR(200) NOT NULL,
PRIMARY KEY (id)
);
CREATE SystemDocuments
(
id INTEGER NOT NULL,
binary_data BLOB NOT NULL,
PRIMARY KEY (id),
FOREIGN KEY (id) REFERENCES Documents (id)
);
CREATE ExternalDocuments
(
id INTEGER NOT NULL,
PRIMARY KEY (id),
FOREIGN KEY (id) REFERENCES SystemDocuments (id)
);
ご覧のとおり、すべてのサブテーブルはDocumentsテーブルの同じIDを共有しています。それ以外SystemDocuments
は、binary_data
列をExternalDocuments
追加し、新しいプロパティを追加しません。'official'
(また、で示される階層には他に2つの具体的なサブテーブルが'individual'
あり、ここでは関連性がないことに注意してください。)
上記のテーブルのマッピングは次のとおりです。
Document.java:
@Entity
@Table(name = "Documents")
@Inheritance(strategy = InheritanceType.JOINED)
@DiscriminatorColumn(name = "discriminator", discriminatorType = DiscriminatorType.STRING)
//@DiscriminatorOptions(force = true) // <-- Hibernate 4-specific annotation not inserting discriminator values
public abstract class Document implements Serializable
{
@Id
@Column
protected Integer id;
@Column(name = "file_name")
protected String fileName;
...
}
SystemDocument.java:
@Entity
@Table(name = "SystemDocuments")
public abstract class SystemDocument extends Document
{
@Lob
@Column(name = "binary_data")
protected byte[] binaryData;
...
}
ExternalDocument.java:
@Entity
@Table(name = "ExternalDocuments")
@DiscriminatorValue(value = "external")
public class ExternalDocument extends SystemDocument
{
...
}
後者のクラスは、ドキュメントのディスクリミネーター列の値にマップされることになっています'external'
。EntityManager.findを介してエンティティを検索すると、ディスクリミネーターが正しく返されます。これは、実際には、テストデータのディスクリミネーターがDBに正しく挿入されているためです。
次に、次のコードを使用して、JPAとファイルアップローダーを介して新しいドキュメント/ファイルをシステムに挿入します。
...
UploadedFile uf = event.getUploadedFile();
// set ID, file name, and binary data
ExternalDocument detachedExternalDocument =
new ExternalDocument(1234567, uf.getName(), uf.getData());
docService.create(detachedExternalDocument);
ただし、DBを調べると、Hibernateがディスクリミネーター値をテーブルの列に挿入していないことがわかります。'external'
Documents
discriminator
これについては過去に問題がありました。https://hibernate.onjira.com/browse/ANN-140を参照してください。最近では、Hibernate 4https : //hibernate.onjira.com/browse/HHH-4358を参照してください。それはそのように機能することになっていますか?
次に、現在のHibernate 4 APIドキュメントでhttp://docs.jboss.org/hibernate/core/4.0/javadocs/org/hibernate/annotations/DiscriminatorOptions.htmlを見つけましたが、機能しません(@DiscriminatorOptionsを参照してください。ドキュメントクラス)。
生の注釈を使用してHibernate4に識別子を挿入するにはどうすればよいですか?
注:ディスクリミネーター列を通常の列としてマップしたくありません。