2017-08-11 134 views
2

我們正在編寫一個針對現有數據庫的新應用程序。我使用Spring數據JPA,並簡單地做一個如何在save()之前停止彈簧數據JPA執行SELECT?

MyRepository.save() 
在我的新實體

,使用

MyRepository extends CrudRepository<MyThing, String> 

我注意到在冬眠插入之前做一個選擇的日誌,以及即使使用索引,他們也需要很長時間。

我在這裏搜索了這個,而answers I've found通常與Hibernate有關。我對JPA相當陌生,看起來JPA和Hibernate好像緊密交織在一起,至少在Spring Data的環境中使用它。鏈接的答案建議使用Hibernate persist(),或者以某種方式使用會話,可能來自entityManager?我沒有必須直接使用會話或實體管理器或任何Hibernate API。到目前爲止,我已經在我的存儲庫中使用save()和一對@Query完成了簡單的插入操作。

+0

你使用autegenerated id爲你的實體? – Zeromus

+0

不可以,我們在2張桌子上看到這種情況。其中一個是主鍵的單個字段,我們實際上是從另一個預生成的數字表中獲得的。我爲該表使用了一個簡單的ID。另一個是複合標識,我使用EmbeddedId – user26270

+1

能夠看到你引用的sql日誌會有用。 – Gimby

回答

2

下面是使用Spring的數據存儲庫中,你使用Spring SimpleJpaRepository代碼:

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

    if (entityInformation.isNew(entity)) { 
     em.persist(entity); 
     return entity; 
    } else { 
     return em.merge(entity); 
    } 
} 

它執行以下操作:

缺省時,Spring數據JPA檢查給定的標識屬性實體。如果標識符屬性爲空,則該實體將被視爲新的,否則不是新的。

Link to Spring Data documentation

所以,如果你的實體中的一個具有ID字段不爲空,春天會讓休眠做一個更新(等等SELECT之前)。

您可以通過同一文檔中列出的兩種方式覆蓋此行爲。一個簡單的方法是讓你的實體實現Persistable(而不是Serializable),這將使你實現方法「isNew」。