我只是在尝试执行实体的更新。但是,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<>();
}