2017-02-13 8 views
1

Wie erstellt benutzerdefinierte Methode von Spring JPA Repository, dass trennt einfügen und aktualisieren Funktionalität? Lassen Sie uns erstellen Methode für einfügen und Update-Methode für die Aktualisierung.Spring JPA-Repository - separate einfügen und Update-Methode

Zusätzliche Frage: Warum Spring JPA Repository diese Methoden nicht durch Design zu trennen?

Meine aktuelle Implementierung ist erstellen Validierung bei Service-Schicht.

Mein Repository

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

Mein Service

@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

Sie können versuchen, Verfahren @Override speichern, wenn Sie Repository erstellen und so dann eine Update-Methode erstellen. Aber ich denke nicht, dass das eine gute Lösung ist. – Mike

+0

Warum willst du es, was willst du erreichen? @Mike: Sie können es nicht überschreiben, da die Speichermethode in der Schnittstelle CrudRepository geschrieben wird. –

+0

Ich habe es vor dem Schreiben versucht und es wurde kompiliert, also dachte ich, du kannst es tun. Es war ein Versuch, aber wie gesagt, es ist keine gute Lösung. – Mike

Antwort

2

Es ist möglich, Ihre eigene Erweiterung auf die standart Feder Datenrepositorien zu bieten: für alle Repositories

Hinzufügen von Verhalten benutzerdefinierte :

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

Sie könnten zum Beispiel implementieren eine Sperrfunktion

void lock(T entity, LockModeType lockModeType); 

Aber in Ihrem Fall würde ich vorschlagen, um nur die Kontrollen weg zu lassen, verursachen SpringDataRepository prüft bereits, wenn seine neue oder nicht. Wenn es eine ID gibt, existiert sie trotzdem, weil Sie hoffentlich keine eigenen IDs erstellen. Es ist alles Teil der Feder Datenvertrag:

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

Diese Validierung nur für die Validierung neuer und aktueller Daten, sodass Spring JPA diese nicht automatisch überschreibt. Aufgrund dieser Validierung muss ich viele Validierungen aller Dienste erstellen. Dann denke ich, es gibt eine Menge von Einfügungs- und Aktualisierungsüberprüfungsbausteinen, so dass ich in einem benutzerdefinierten Repository vereinfachen muss. –

+0

Ich würde sagen, Sie brauchen es nicht wirklich, denn wenn Sie eine neue Entität haben, wird die ID nicht gesetzt.Als solches wird es beibehalten (isNew() check in save()). Wenn Sie einen bestehenden haben, wird es eine ID haben und jpa wird versuchen, es zu bestehen. Die Persistenz kann mehr Eigenschaften wie optimistisches Sperren haben, die helfen, gleichzeitige Manipulation zu finden -> https://vladmihalcea.com/2015/01/12/a-beginners-guide-to-java-persistence-locking/ – Dudelilama

+0

Ja, ID wird nicht eingestellt. Sie können jedoch nicht verhindern, dass der Benutzer keine ID eingibt oder hinzufügt. Beispiel für create-Methode: HTTP POST/foo {id: 1, attr: A}, wenn Sie nur save() verwenden, wird die vorhandene Entität durch eine neue Entität überschrieben (merge()). Daher muss ich eine Validierung hinzufügen, die verhindert, dass Benutzer die create-Methode verwenden, sodass er die Daten nicht mit save() aktualisieren kann. –

Verwandte Themen