JPA:违反数据完整性而不是 Upsert

JPA: Data integrity violation instead of Upsert

我有这个带有这些字段和这个主键的实体:

@Getter
@Setter
@Entity
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Table(name = "MY_TABLE", schema = "MY_SCHEME")
public class MyEntity{

    @Id
    @Column(name = "ID")
    private String id;

    @Column(name = "NAME")
    private String name;

    @Column(name = "DESCRIPTION")
    private String description;

}

我遇到了一些不希望的事情 behavior.If 我尝试插入完全相同的数据,我期待主键违规,因为它已经存在,但我发现它正在做的是一个 upsert。我正在从 JpaRepository 扩展我的存储库并使用保存方法:

@Repository
public interface MyJpaRepository extends JpaRepository<MyEntity, String> {

}

为我服务:

...
this.repository.save(myEntity);
...

数据库是 Oracle,如果我在 SQL developer 中手动启动插入,就会发生数据违规。

这可能会发生吗?

基于 save 的源代码:

public <S extends T> S save(S entity) {

        Assert.notNull(entity, "Entity must not be null.");

        if (entityInformation.isNew(entity)) { //it checks if entity is new based on id. i.e. insert operation.
            em.persist(entity);
            return entityx
        } else {
            return em.merge(entity); // just merging i.e. in your case doing upsert.
        }
    }

所以目前保存方法按预期工作;但如果你真的想避免 upsert 行为,你可能想尝试使用 existsById;如下所示:

if(!repository.existsById(..)){
    repository.save(..);
}