为什么在迁移到 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 现在我想知道为什么不再允许这样做。
问题
- 这是错误还是功能?如果一个功能:此更改背后的理由是什么?
- 如何避免这种情况?
- 如果 "circumvent" 不是一个有效的想法:应该如何更改上述代码片段以将其正确迁移到 Hibernate >= 5。4.x。
欢迎任何可靠的答案。
我的回答如下:
映射不正确根据JPA 2.2 specification,@MappedSuperclass
和@Inheritance
不能一起使用。看起来,上面的映射在早期的 Hibernate 版本中是 tolerated。然而,这种支持似乎在 Hibernate 5.4.x 中被移除了。
要解决上述特定场景中的问题,您可以将 @MappedSuperclass
替换为 @Entity
,它应该可以正常工作。
Hibernate forum中也有类似的问题。
您还可以查看 HHH-13217,其中 Gail Badner 和 Vlad Mihalcea(均为 Hibernate 开发人员)正在讨论此问题。
在下一个即将发布的 5.4.2 版本中,如果 @Inheritence
与 @MappedSuperclass
一起使用,将被忽略(请参阅 Github 上的相关 PR)。
我正在迁移几个代码库以使用 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 现在我想知道为什么不再允许这样做。
问题
- 这是错误还是功能?如果一个功能:此更改背后的理由是什么?
- 如何避免这种情况?
- 如果 "circumvent" 不是一个有效的想法:应该如何更改上述代码片段以将其正确迁移到 Hibernate >= 5。4.x。
欢迎任何可靠的答案。
我的回答如下:
映射不正确根据JPA 2.2 specification,
@MappedSuperclass
和@Inheritance
不能一起使用。看起来,上面的映射在早期的 Hibernate 版本中是 tolerated。然而,这种支持似乎在 Hibernate 5.4.x 中被移除了。要解决上述特定场景中的问题,您可以将
@MappedSuperclass
替换为@Entity
,它应该可以正常工作。
Hibernate forum中也有类似的问题。
您还可以查看 HHH-13217,其中 Gail Badner 和 Vlad Mihalcea(均为 Hibernate 开发人员)正在讨论此问题。
在下一个即将发布的 5.4.2 版本中,如果 @Inheritence
与 @MappedSuperclass
一起使用,将被忽略(请参阅 Github 上的相关 PR)。