我只是试图对实体进行更新。但是,休眠状态会尝试2条SQL语句,其中一条执行正确的更新,另一条不必要的第二条仅将ID更新为null,这会导致我的应用程序失败。
我与Hibernate一起使用Spring Data,并且在执行实体更新时,我看到执行了预期的更新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);
答案 0 :(得分:0)
我认为可能的原因是,如果您将两个实体及其ID关联为外键,那么休眠可能会尝试将父级的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<>();
}