Spring数据保存更新ID为空

时间:2018-10-02 07:03:05

标签: java hibernate jpa spring-data-jpa spring-data

我只是试图对实体进行更新。但是,休眠状态会尝试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);

1 个答案:

答案 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<>();

}