当前位置: 首页 > 面试题库 >

Hibernate4:保留InheritanceType.JOINED鉴别符列值

陈业
2023-03-14
问题内容

我有一个简单的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
{
    ...
}

后者应映射到Documents的discriminator列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文档中找到了http://docs.jboss.org/hibernate/core/4.0/javadocs/org/hibernate/annotations/DiscriminatorOptions.html,但它不起作用(请参阅文档类)。

我如何让Hibernate 4 使用原始注释 插入区分

注意 :我不想将鉴别符列映射为常规列。


问题答案:

首先,这个问题是InheritanceType.JOINED中Discriminator的副本。

好像正在联接坚持继承鉴别器值, 要求JPA规范。这是我通过电子邮件从JPA专家组的成员那里收到的信息:

该规范不需要使用区分符列来实现JOINED继承的实现,但是,假设是如果指定了@DiscriminatorColumn,则将使用它,即将值写出。我们没有明确声明如果在代码中指定了@DiscriminatorColumn,则必须使用,就像我们没有明确声明如果指定了@Column或@JoinColumn一样,值必须存储在表中,但是存在我们只能或应该指定这么多。在最低级别上,仅假设了某些物理定律和推理。

Hibernate面临的问题已经有一段时间了,请参见此处:

https://hibernate.atlassian.net/browse/ANN-140

拒绝评论:

EJB3不需要将识别符与JOINED映射策略一起使用。它 允许
用于需要鉴别的JOINED映射策略的劣质实现。Hibernate不需要区分符,因为Hibernate比其他劣等实现要好。

最后,只有SINGLE_TABLE策略需要一个鉴别符列,而无需实现JOINED 即可
。当前,Hibernate的问题在于,即使在将鉴别符与JOINED一起使用的情况下,即使JPA规范建议保留鉴别符值,当在使用@DiscriminatorColumn映射的JOINED继承中保留子实体时,它也会导致数据不一致。在RFE中查看更多信息:

https://hibernate.atlassian.net/browse/HHH-6911



 类似资料:
  • 问题内容: 是否可以强制休眠将歧视符列用于继承的继承类型?根据JPA2.0规范,这应该可行,但是我无法在休眠状态下实现。 例: 使用hibernate.hbm2ddl.auto create时,这甚至都不会在表PARENT中创建列TYPE。 我知道InheritanceType.JOINED可以在不定义鉴别符列的情况下工作,但是它是非常无效的,因为在使用鉴别符列中的信息时,休眠需要在父对象和所有子

  • 问题内容: 我有一个Client和Affiliate类,它是从Person类继承的。正在使用联接的继承策略类型- 它们中的每一个都与父类共享主键。由于没有鉴别符列,我们选择使用DescriptorCustomizer和ClassExtractor。但是它并没有真正让人们知道它是如何工作的,而且代码似乎也没有编译。如果有人给出一个带有代码片段的漂亮示例以供理解,那将是很好的。 问题答案: 根据上述文

  • 在@inheritage类型Joined中 我有班级成员、员工和学生 因此,当我保存Employee或Student记录,然后检索Person记录时,它给我的鉴别器列值为NULL,但在重新启动服务器后,它给我相应的值 如果我手动设置鉴别器列值的值,然后保存和检索,那么它会给我这个值(我需要手动设置鉴别器列值吗?)那么使用鉴别器列有什么好处呢 为什么我不应该使用一个具有列类型的employee和st

  • Discriminator 是一种 schema 继承机制。 他允许你在相同的底层 MongoDB collection 上 使用部分重叠的 schema 建立多个 model。 假设你要在单个 collection 中记录多种 event, 每个 event 都有时间戳字段,但是 click 事件还有 URL 字段, 这时你可以用 model.discriminator() 实现上述要求。 此函

  • 问题内容: 您好,我有一个子类,需要覆盖多个鉴别值。 就像是: @DiscriminatorValue(值=“ ACT”,“ DNR”,“ ATT”) 会让我完美。 我们拥有现有的数据,可以将多个鉴别符映射到一个类别(因为它们是我们系统将考虑的同一事物的相似类型) 问题答案: 您可以使用DiscriminatorFormula:

  • 问题内容: 我似乎在Hibernate中映射列表时遇到问题。在我们的项目中有一类用含有类与含有。 Hibernate 是否可以使用注释进行映射?我的意思是,因为它没有注释? 问候 问题答案: 用途: 资料来源: 7.2.3。基本类型和可嵌入对象的集合