【发布时间】:2011-12-20 18:51:03
【问题描述】:
我有一个简单的 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' 和'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 查找实体时,鉴别器被正确返回,实际上是因为我的测试数据的鉴别器已正确插入到数据库中。
现在我使用以下代码通过 JPA 和文件上传器将新文档/文件插入系统:
...
UploadedFile uf = event.getUploadedFile();
// set ID, file name, and binary data
ExternalDocument detachedExternalDocument =
new ExternalDocument(1234567, uf.getName(), uf.getData());
docService.create(detachedExternalDocument);
但在检查数据库时,我可以看到 Hibernate 不将 'external' 鉴别器值插入到 Documents 表的 discriminator 列中。
过去有过这方面的问题,请参阅 https://hibernate.onjira.com/browse/ANN-140 以及最近的 Hibernate 4 https://hibernate.onjira.com/browse/HHH-4358,所以它应该以这种方式工作。
然后我在当前的 Hibernate 4 API Docs 中找到了http://docs.jboss.org/hibernate/core/4.0/javadocs/org/hibernate/annotations/DiscriminatorOptions.html,但它不起作用(参见 Document 类中的 @DiscriminatorOptions)。
如何让 Hibernate 4使用原始注释插入鉴别器?
注意:我不想将鉴别器列映射为常规列。
【问题讨论】:
标签: java hibernate inheritance jpa discriminator