2013-07-23 3 views
6

Widzę więc, że MongoTemplate firmy Spring Data ma wiele różnych typów operacji "składowania obiektów", takich jak zapisywanie, aktualizowanie, wstawianie i aktualizowanie pierwszego.Dlaczego dane MongoRepository w Spring Data są tak ograniczone?

Z kolei interfejs MongoRepository w Spring Data ma jedną metodę trwałości: "zapisz". Teraz, oczywiście, jeśli chcę tworzyć/aktualizować/rozszerzać funkcjonalności, mogę je łatwo wdrożyć. Po prostu zrób, zanim zadzwonisz "zapisz" i sprawdź, czy jednostka istnieje, czy nie. Ale wydaje się dziwne, że MongoTemplate ma tak różnorodne opcje (nie mogę nawet stwierdzić, jaka jest różnica pomiędzy zachowaniem a upsertem), ale repozytorium Spring Data jest tak ograniczone.

Czy uważasz, że marnowanie/leniwy jest używanie Spring Data MongoRepositories bez dostosowywania jego metod, jeśli zamierzasz używać semantyki create/update, lub jest różnica między get + null check + repository.save vs. mongoTemplate.insert też nie ma znaczenia, żeby się tym przejmować?

Odpowiedz

0

Dane sprężyste są następujące: repository pattern. Repository to abstrakcja w stosunku do warstwy DAO i służy do generycznego przechowywania i pobierania jednostek domen. Na dole warstwy repozytorium znajduje się część warstwy DAO, w której użyto MongoTemplate.

Tak więc Repository ma metodę zapisu logicznego. Z punktu widzenia domeny nie powinieneś przejmować się tym, w jaki sposób w ogóle utrzymuje się domena. Wystarczy zadzwonić i zapisać metodę użycia MongoTemplate w zależności od implementacji MongoRepository.

3

Możesz dostosować swoje własne repozytorium za pomocą XXXRepositoryCustom i napisać jego implementację.

Oto przykład:

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

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

} 

Wskazówka powyższy interfejs rozszerza swój własny interfejs AccountRepositoryCustom.

Następnie zdefiniować własną AccountRepositoryCustom:

public interface AccountRepositoryCustom { 

    public boolean updateAccountToken(String id, String token); 

} 

Następnie napisać implementację dla niego:

public class AccountRepositoryCustomImpl implements AccountRepositoryCustom { 

    @Autowired 
    private MongoTemplate mongoTemplate; 

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

Tak, już to zrobiłem. Ale to jest dużo kodu do napisania ze względu na aktualizację i metodę tworzenia, gdy głównym punktem repozytoriów Spring Data jest redukcja kodu standardowego IMO. – CorayThan