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

Why is the MappedSuperClass annotation no longer valid in combination with @Inheritance when migrating to Hibernate 5.4.x?

我正在迁移几个代码库以使用 Hibernate 5。4.x 而不是 Hibernate 5。2.x。

对于抽象基础 class 我使用

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

但是,ORM 会通过错误消息抱怨此问题

An entity cannot be annotated with both @Inheritance and @MappedSuperclass

这不是 Hibernate <= 5 的问题。2.x 现在我想知道为什么不再允许这样做。

问题

  1. 这是错误还是功能?如果一个功能:此更改背后的理由是什么?
  2. 如何避免这种情况?
  3. 如果 "circumvent" 不是一个有效的想法:应该如何更改上述代码片段以将其正确迁移到 Hibernate >= 5。4.x。

欢迎任何可靠的答案。

我的回答如下:

  1. 映射不正确根据JPA 2.2 specification@MappedSuperclass@Inheritance不能一起使用。看起来,上面的映射在早期的 Hibernate 版本中是 tolerated。然而,这种支持似乎在 Hibernate 5.4.x 中被移除了。

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

Hibernate forum中也有类似的问题。

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

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