AssertionFailure:尝试保存标识一对一关系时的空标识符

AssertionFailure: null identifier when try to save identifying one-to-one relation

我正在尝试与 Spring Data JPA 建立识别关系。
以下是我的(简化的)实体。

@Entity
class AuthorizationCodeEntity(
    @MapsId
    @OneToOne
    @JoinColumn(name = "authorization_id")
    val authorization: AuthorizationEntity
)  {
    @Id
    @field:Size(max = 16)
    val authorizationId: UUID = UUID(0, 0)
}
@Entity
class AuthorizationEntity {
    @OneToOne(mappedBy = "authorization", cascade = [CascadeType.REMOVE])
    val authorizationCodeEntity: AuthorizationCodeEntity? = null
}

但是在我尝试保存实体时,发生了异常。

Caused by: org.hibernate.AssertionFailure: null identifier
    at org.hibernate.engine.spi.EntityKey.<init>(EntityKey.java:51) ~[hibernate-core-5.6.8.Final.jar:5.6.8.Final]
    at org.hibernate.internal.AbstractSharedSessionContract.generateEntityKey(AbstractSharedSessionContract.java:559) ~[hibernate-core-5.6.8.Final.jar:5.6.8.Final]
    at org.hibernate.type.OneToOneType.isNull(OneToOneType.java:108) ~[hibernate-core-5.6.8.Final.jar:5.6.8.Final]
    at org.hibernate.type.EntityType.resolve(EntityType.java:463) ~[hibernate-core-5.6.8.Final.jar:5.6.8.Final]
    at org.hibernate.type.EntityType.resolve(EntityType.java:458) ~[hibernate-core-5.6.8.Final.jar:5.6.8.Final]
    at org.hibernate.type.EntityType.replace(EntityType.java:359) ~[hibernate-core-5.6.8.Final.jar:5.6.8.Final]
    at org.hibernate.type.AbstractType.replace(AbstractType.java:164) ~[hibernate-core-5.6.8.Final.jar:5.6.8.Final]
...

当我把PK改成Long(AUTO_INCREMENT)时,一切顺利
但是使用 UUID,null identifier 会发生异常。
有谁知道我的代码有什么问题吗?

你的代码是正确的,问题出在你的实体中的 val authorizationId: UUID = UUID(0, 0) 分配:你总是为 UUID 字段分配一个空的“nil”uuid(所有位设置为零)所以休眠信号大约它作为空标识符存在。要解决此问题,您可以选择使用 GenericGenerator (see for example this ) 为您的 Entity 自动生成一个非空 UUID,或者每次手动为您的字段分配一个非空 UUID,而如果您切换则没有问题您的主键类型为 Long.