我有一个简单的 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'
在此不相关。)
以下是上表的映射:
文档.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;
...
}
系统文档.java:
@Entity
@Table(name = "SystemDocuments")
public abstract class SystemDocument extends Document
{
@Lob
@Column(name = "binary_data")
protected byte[] binaryData;
...
}
外部文档.java:
@Entity
@Table(name = "ExternalDocuments")
@DiscriminatorValue(value = "external")
public class ExternalDocument extends SystemDocument
{
...
}
后一个类应该映射到 Documents 的鉴别器列 value '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,但它不起作用(参见@DiscriminatorOptions 在文档类)。
如何让 Hibernate 4使用原始注释插入鉴别器?
注意:我不想将鉴别器列映射为常规列。