春季数据保存将更新 ID 为空



我只是在尝试执行实体的更新。但是,hibernate会尝试2个SQL语句,一个用于执行正确的更新,另一个用于将ID单独更新为null,这会导致我的应用程序失败。

我正在使用 Spring Data 和 Hibernate,在执行实体更新时,我看到执行预期的更新 SQL,但是当使用 SQL Server 运行应用程序时,会尝试进行后续更新,该更新执行以下操作:

update my_table set id=null where id=?

这显然失败了。

Cannot update identity column 'ID'.

使用 H2 运行相同的代码,我没有看到触发第二次更新。

知道这种行为的原因是什么吗?

我正在扩展 JpaRepository 并使用默认的 save((。

这是我实体的片段:

@Table(name = "MY_TABLE")
@Entity
public class MyEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column
private String anotherValue;
@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.LAZY)
@JoinColumn(name="id")
private List<ChildEntity> children = new ArrayList<>();
// getters, builder, private default constructor ...

构建我的实体的代码段:

MyEntity.newBuilder()
.withId(id)
.withAnotherValue(valueUpdate)
.build();

存储 库:

public interface MyRepository extends JpaRepository<MyEntity, Long>

储蓄:

myRepository.save(myUpdatedEntity);

我认为可能的原因是,如果您将两个实体与其 ID 关联为外键,那么 hibernate 可能会尝试将父级的 ID 更新为其他实体的外键。它不是正确的关联方式。

在一对多关系中,在多端实体中添加外键,该外键必须引用单端实体类的主键。

@Entity
public class MyEntity {
..
@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.LAZY)
@JoinColumn(name="id", referencedColumnName = "MYENTITY_ID")
private List<ChildEntity> children = new ArrayList<>();
}

相关内容

  • 没有找到相关文章

最新更新