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
.
我正在尝试与 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
.