【发布时间】:2021-10-18 15:45:43
【问题描述】:
我们刚刚修复了 Hibernate 中的一个行为,在该行为中,它在本地计算机上生成的查询与在暂存服务器上生成的查询不同。谁能给我解释一下,为什么
@NotNull
@OneToOne(fetch = FetchType.EAGER)
@Type(type = "user_account")
open var user: T
在本地翻译成
来自
用户密码摘要pa0_
left external join user_account basicaccou1_ on abstractpa0_.user_id=basicaccou1_.id
在服务器上,在 Kubernetes 上运行 dockerized,它被翻译成
来自用户密码摘要pa0_
左外连接 d21_user_account useraccoun1_ on abstractpa0_.user_id = useraccoun1_.id
左外连接 user_account useraccoun1_1_ on useraccoun1_.id = useraccoun1_1_.id
我们使用单表继承策略。基类是AbstractPasswordEntity
@Entity(name = "user_password")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "user_type")
abstract class AbstractPasswordEntity<T : BasicAccountEntity>(
...
@NotNull
@OneToOne(fetch = FetchType.EAGER)
@Type(type = "user_account")
open var user: T
) : BaseEntity()
由客户实施
@Entity(name = "CustomerPassword")
@DiscriminatorValue("CustomerPasswordEntity")
class CustomerPasswordEntity(
id: Long? = null,
passwordHash: String,
user: CustomerAccountEntity
) : AbstractPasswordEntity<CustomerAccountEntity>(..., user)
和员工课程。
@Entity(name = "StaffPassword")
@DiscriminatorValue("StaffPasswordEntity")
class StaffPasswordEntity(
id: Long? = null,
passwordHash: String,
user: StaffAccountEntity
) : AbstractPasswordEntity<StaffAccountEntity>(..., user)
我们可以通过将AbstractPasswordEntity 中的关系注释更改为
@Entity(name = "user_password")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "user_type")
abstract class AbstractPasswordEntity<T : BasicAccountEntity>(
...
@NotNull
@OneToOne(fetch = FetchType.EAGER, targetEntity = BasicAccountEntity::class)
open var user: T
) : BaseEntity()
这现在以相同的方式在所有环境中编译和执行。我唯一不知道的是刚刚发生了什么以及为什么发生。
Funfact:与 pkgdiff 和 md5deep 相比,staging 和本地的 jar 显示完全相同的结果 - 除了 GitLab 属性。
【问题讨论】: