首页 > 解决方案 > 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

标签: javaspringhibernate

解决方案


我相信这是由于在您的 OtoUniChild 类中双重定义了 @Id :

  • 一次在Heartcore超类中。
  • 一次在实体本身

虽然不允许使用@MappedSuperclass重新定义,但您碰巧使用相同的名称和类型重新定义它。但是,您仍然可以期望一些方法看到前者,而一些后者的字段。


推荐阅读