2013-07-23 6 views
6

So merke ich, dass Spring Data's MongoTemplate viele verschiedene Arten von "Objekt speichern" -Operationen hat, wie Speichern, Upsert, Einfügen und UpdateFirst.Warum ist das MongoRepository von Spring Data so begrenzt?

Die MongoRepository-Schnittstelle von Spring Data verfügt dagegen über eine Persistenzmethode: "Speichern". Jetzt, wenn ich Funktionen erstellen/update/upsert möchte, kann ich sie natürlich ziemlich einfach implementieren. Machen Sie einfach einen Befehl, bevor Sie "Speichern" aufrufen und prüfen Sie, ob die Entität existiert oder nicht. Aber es scheint komisch, dass MongoTemplate eine solche Vielfalt an Optionen hat (ich kann nicht einmal herausfinden, was der Unterschied zwischen einem Speichern und einem Upsert ist), aber die Repos von Spring Data sind so begrenzt.

Denken Sie, es ist verschwenderisch/faul, Spring Data MongoRepositories zu verwenden, ohne seine Methoden anzupassen, wenn Sie die create/update-Semantik verwenden, oder ist der Unterschied zwischen einer get + null-Prüfung + repository.save vs. mongoTemplate.insert zu irrelevant zu kümmern?

Antwort

0

Federdaten folgen repository pattern. Repository ist eine Abstraktion über DAO-Ebene und dient zum generischen Speichern und Abrufen von Domänenentitäten. Am unteren Rand der Repository-Schicht befindet sich der DAO-Layer-Teil, wo MongoTemplate verwendet wird.

So Repository hat logische speichern Methode. Aus Domain-Sicht sollte es Ihnen egal sein, wie Domain-Entity überhaupt beibehalten wird. Sie rufen nur speichern Methode und Verwendung von MongoTemplate hängt von MongoRepository Implementierung.

3

Sie können Ihr eigenes Repository mit XXXRepositoryCustom anpassen und eine Implementierung dafür schreiben. Hier

ein Beispiel:

public interface AccountRepository extends MongoRepository<Account, String>, AccountRepositoryCustom{ 

    @Query("{ 'email' : ?0 }") 
    Account findByEmail(String email); 

} 

Beachten Sie die obige Schnittstelle Ihre eigene AccountRepositoryCustom-Schnittstelle erweitert.

dann Ihre eigene AccountRepositoryCustom definieren:

public interface AccountRepositoryCustom { 

    public boolean updateAccountToken(String id, String token); 

} 

Weiter, schreiben Sie eine Implementierung für sie:

public class AccountRepositoryCustomImpl implements AccountRepositoryCustom { 

    @Autowired 
    private MongoTemplate mongoTemplate; 

    @Override 
    public boolean updateAccountToken(String id, String token) {  
      // your code 
    } 
} 
+2

Ja, das habe ich schon mal gemacht. Aber das ist eine Menge Standardcode zum Schreiben, um ein Update und eine Erstellungsmethode zu erhalten, wenn der Hauptzweck der Repositorys von Spring Data darin besteht, den Standardcode IMO zu reduzieren. – CorayThan

Verwandte Themen