java - Spring Boot & Hibernate - x 实例的标识符已更改为 null
问题描述
我们为所有用 调用Heartcore
的实体提供了一个超类@MappedSuperclass
。
@Id
private String id;
@Column(nullable = false)
@NonNull
private String uuid;
@NonNull
@Column(nullable = false)
private String kanton;
// specific Setter
public void setKanton(String kanton) {
if (kanton != null) {
id = uuid + "_" + kanton;
}
this.kanton = kanton;
}
public void setUuid(String uuid) {
if (kanton != null) {
id = uuid + "_" + kanton;
}
this.uuid = uuid;
}
我有以下单向一对一关系:
子实体
class OtoUniChild extends Heartcore {
@Id
private String id;
@OneToOne
@MapsId
private OtoUniParent otoUniParent;
public void setOtoUniParent(OtoUniParent otoUniParent) {
if (otoUniParent != null) {
if (StringUtils.isNoneBlank(otoUniParent.getUuid(), otoUniParent.getKanton())) {
this.otoUniParent = otoUniParent;
setUuid(otoUniParent.getUuid());
setKanton(otoUniParent.getKanton());
return;
}
throw new InvalidObjectException("Es wurde ein invalides Objekt übergeben!");
}
this.otoUniParent = null;
}
当我坚持一个父母和一个孩子然后尝试从孩子存储库中获取一个孩子时,findById(149727fd-b0ce-4069-bcd9-d67fdbe69021_SG)
我得到了错误"org.springframework.orm.jpa.JpaSystemException: identifier of an instance of x.data.OtoUniChild was altered from 149727fd-b0ce-4069-bcd9-d67fdbe69021_SG to null;"
。我不知道这怎么会发生!
*Spring Boot v.1.5.8.RELEASE
解决方案
我相信这是由于在您的 OtoUniChild 类中双重定义了 @Id :
- 一次在
Heartcore
超类中。 - 一次在实体本身
虽然不允许使用@MappedSuperclass
重新定义,但您碰巧使用相同的名称和类型重新定义它。但是,您仍然可以期望一些方法看到前者,而一些后者的字段。
推荐阅读
- php - 将 XML 标记解析为数组,不依赖于 XML 结构
- python - H3 六边形不匹配
- javascript - Apollo 客户端:使用修改过的变量重新获取数据,useQuery 还是 useLazyQuery?
- c# - 如果创建不成功,Web API 控制器“创建”操作应该抛出什么类型的异常?
- python - 密码生成器有效密码检查
- gcc - GCC 使用软件浮点库移植到新目标
- android - 位置在 android 中不断更新,而不是一次
- r - R 将国家名称附加为向量中的数字
- python - Airflow - BigQuery 架构字段中的值无效
- java - Java正则表达式解析两级结构