从 2.x 升级到 Spring Boot 3 后,JPA 继承策略 InheritanceType.JOINED 行为不正确。
我有以下实体书和计算机书
书
@Entity(name = "book")
@Inheritance(strategy = InheritanceType.JOINED)
abstract class Book @JvmOverloads constructor(
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
open var id: Long,
open var author: String,
open var publisher: String
)
电脑书
@Entity(name = "computer_book")
@DiscriminatorValue("computer")
data class ComputerBook @JvmOverloads constructor(
override var id: Long,
override var author: String,
override var publisher: String,
var language: String
): Book(
id,
author,
publisher
)
当我使用 BookRepository 获取 ComputerBook 实体时,我得到的结果如下:
id = 1
author= null
publisher = null
language = "Php"
Book.id = 0
Book.author = "Jhon Doe"
Book.publisher = "Bright publishers"
但是当我使用 spring boot 2.x 时,我获得的实体是
id = 1
author= "Jhon Doe"
publisher = "Bright publishers"
language = "Php"
Book.id = 0
Book.author = null
Book.publisher = null
这是 Spring Boot 3 中的 Bug 还是我遗漏了什么?
这看起来不像是一个错误。 如果您在 Hibernate 中打开 sql 语句日志,您将看到数据已正确保存和选择。
但是当实体对象被创建时,Hibernate会将其转换为相应的对象。如果它是一个 Book 对象,则使用实体 Book 中的字段来存储值。如果它是 ComputerBook,则 Book 中的字段将填充值,但您会从 ComputerBook 中获得 overridden 字段(未从 DB 初始化)。 请注意,Hibernate 不会填充覆盖的字段。如果您只需要此字段将其传输到 Book 构造函数,您可以将字段声明从“override varauthor:String”更改为“author:String”。