我有這個具有這些欄位和主鍵的物體:
@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;
}
我遇到了一些不良行為。如果我嘗試插入完全相同的資料,我期待主鍵違規,因為它已經存在,但我發現它正在做的是一個 upsert。我正在從 JpaRepository 擴展我的存盤庫并使用 save 方法:
@Repository
public interface MyJpaRepository extends JpaRepository<MyEntity, String> {
}
在我的服務中:
...
this.repository.save(myEntity);
...
資料庫是 Oracle,如果我在 SQL 開發人員中手動啟動插入,則會發生資料沖突。
那可能會發生嗎?
uj5u.com熱心網友回復:
基于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(..);
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/471010.html
