2017-02-13 104 views
1

如何從Spring JPA Repository創建自定義方法,分離插入和更新功能?我們假設創建插入方法更新方法更新Spring JPA Repository - 獨立的插入和更新方法

其他問題: 爲什麼Spring JPA Repository沒有按設計區分這些方法?

我目前的實施是在服務層創建驗證。

我的倉庫

public interface UserRepository extends CrudRepository<User, Integer> {} 

我的服務

@Service 
public class UserService { 
    public void addUser(User user) { 
     if (!userRepository.exists(user.getId())) { 
      userRepository.save(user); 
     } 
    } 

    public void updateUser(int id, User user) { 
     if (userRepository.exists(user.getId())) { 
      userRepository.save(user); 
     } 
    } 
} 
+0

您可以嘗試@Override保存在創建庫等然後創建一個更新方法的方法。但我不認爲這是一個好的解決方案。 – Mike

+0

爲什麼你想要它,你想達到什麼目的? @Mike:你不能覆蓋它,因爲保存方法寫在CrudRepository 界面中。 –

+0

我在編寫之前就試過了,它正在編譯,所以我認爲你可以做到。這是一個嘗試,但正如我所說這不是一個好的解決方案。 – Mike

回答

2

它可以提供自己的擴展到非標準春數據倉庫:

添加自定義行爲所有存儲庫:

https://docs.spring.io/spring-data/data-commons/docs/current/reference/html/#repositories.custom-behaviour-for-all-repositories

例如,您可以實現鎖定功能

void lock(T entity, LockModeType lockModeType); 

但在你的情況,我建議,剛剛離開的檢查了,導致SpringDataRepository已經檢查自己的新的或沒有。如果有一個ID,它仍然存在,因爲你希望不要創建自己的ID。這是春天的數據合同的一部分:

SimpleJpaRepository:

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

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

該驗證僅用於驗證新數據和當前數據,因此Spring JPA不會自動覆蓋它。由於驗證,我需要創建所有服務的許多驗證。然後我認爲有很多插入和更新驗證樣板,所以我需要在一個自定義存儲庫中進行簡化。 –

+0

我想說你不需要它,因爲如果你有一個新的實體,這個ID將不會被設置。因此它會被保存(isNew()檢入save())。如果你有一個現有的,它將有一個ID和JPA將嘗試堅持下去。 堅持可以有更多的特徵,如樂觀鎖定,幫助找到併發操作 - > https://vladmihalcea.com/2015/01/12/a-beginners-guide-to-java-persistence-locking/ – Dudelilama

+0

是的,ID將不會被設置。但是你不能阻止用戶不注入或添加ID。創建方法的示例:HTTP POST/foo {id:1,attr:A},如果您只使用save(),則現有實體將被新的覆蓋(merge())。所以我需要添加驗證來防止使用create方法的用戶,所以他不能通過save()更新數據。 –