spring boot 3 jpa继承无法正常工作

问题描述 投票:0回答:1

从 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 还是我遗漏了什么?

spring-boot kotlin spring-data-jpa
1个回答
0
投票

这看起来不像是一个错误。 如果您在 Hibernate 中打开 sql 语句日志,您将看到数据已正确保存和选择。

但是当实体对象被创建时,Hibernate会将其转换为相应的对象。如果它是一个 Book 对象,则使用实体 Book 中的字段来存储值。如果它是 ComputerBook,则 Book 中的字段将填充值,但您会从 ComputerBook 中获得 overridden 字段(未从 DB 初始化)。 请注意,Hibernate 不会填充覆盖的字段。如果您只需要此字段将其传输到 Book 构造函数,您可以将字段声明从“override varauthor:String”更改为“author:String”。

© www.soinside.com 2019 - 2024. All rights reserved.