迁移到 Hibernate 5.4.x 时,为什么 MappedSuperClass 注释与 @Inheritance 结合使用不再有效?

MWi*_*ner 4 java hibernate jpa jpa-2.1 hibernate-5.x

我正在迁移多个代码库以使用 Hibernate 5.4.x 而不是 Hibernate 5.2.x。

对于我使用的抽象基类

@MappedSuperclass
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public abstract class AbstractPersistentJPAObject extends AbstractPersistentObject {
    // some properties
}
Run Code Online (Sandbox Code Playgroud)

然而,ORM 对此进行了抱怨,并显示错误消息

实体不能同时使用@Inheritance和进行注释@MappedSuperclass

对于 Hibernate <= 5.2.x 来说这不是问题,现在我想知道为什么不再允许这样做。

问题

  1. 这是一个错误还是一个功能?如果是一个功能:这一变化背后的理由是什么?
  2. 可以采取什么措施来规避这种情况?
  3. 如果“规避”不是一个有效的想法:应该如何更改上述代码片段以将其正确迁移到 Hibernate >= 5.4.x。

欢迎任何可靠的答案。

rzo*_*rzo 6

我的回答如下:

  1. 根据JPA 2.2 规范,该映射不正确,并且不能一起使用。看起来,上面的映射在早期的 Hibernate 版本中是可以容忍的。然而,这种支持似乎在 Hibernate 5.4.x 中被删除。@MappedSuperclass@Inheritance

  2. 要解决上述特定场景中的问题,您可以替换@MappedSuperclass@Entity,它应该可以正常工作。

Hibernate论坛中也有类似的问题。

您还可以查看HHH-13217,其中 Gail Badner 和 Vlad Mihalcea(均为 Hibernate 开发人员)正在讨论此问题。

在下一个即将发布的版本 5.4.2 中,@Inheritence如果与它一起使用,将被忽略(请参阅Github@MappedSuperclass上的相关 PR )。