为啥在迁移到 Hibernate 5.4.x 时 MappedSuperClass 注释与 @Inheritance 结合不再有效?
Posted
技术标签:
【中文标题】为啥在迁移到 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 时 MappedSuperClass 注释与 @Inheritance 结合不再有效? 【发布时间】:2019-03-14 10:36:33 【问题描述】:我正在迁移几个代码库以使用 Hibernate 5.4.x 而不是 Hibernate 5.2.x。
对于我使用的抽象基类
@MappedSuperclass
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public abstract class AbstractPersistentJPAObject extends AbstractPersistentObject
// some properties
但是,ORM 会通过错误消息对此进行抱怨
不能同时使用
@Inheritance
和@MappedSuperclass
注释实体
这不是 Hibernate
问题
-
这是错误还是功能?如果是一项功能:此更改背后的基本原理是什么?
可以做些什么来规避这种情况?
如果“规避”不是一个有效的想法:应如何更改上述代码片段以将其正确迁移到 Hibernate >= 5.4.x。
欢迎任何可靠的答案。
【问题讨论】:
【参考方案1】:我的答案如下:
映射不正确根据JPA 2.2 specification、@MappedSuperclass
和@Inheritance
不能一起使用。看起来,上面的映射在早期的 Hibernate 版本中是容忍的。然而,这种支持似乎在 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 时 MappedSuperClass 注释与 @Inheritance 结合不再有效?的主要内容,如果未能解决你的问题,请参考以下文章
为啥将 VB.NET 代码迁移到 C# 时,for 循环的行为会有所不同?
为啥从 .net core 3.1 迁移到 .net 5 时 JSON 返回值发生了变化
从 MySQL 到 SQL Server 的 Hibernate + Spring 迁移