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(..);
}
我有这个带有这些字段和这个主键的实体:
@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(..);
}