2013-07-23 16 views
6

Quindi noto che MongoTemplate di Spring Data ha molti diversi tipi di operazioni di "salva oggetto", come salvataggio, upsert, insert e updateFirst.Perché il MongoRepository di Spring Data è così limitato?

L'interfaccia MongoRepository di Spring Data, d'altra parte, ha un metodo di persistenza: "salva". Ora, ovviamente, se voglio creare funzionalità di aggiornamento/aggiornamento/upsert, posso implementarle abbastanza facilmente. Fai un salto prima di chiamare "salva" e controlla se l'entità esiste o meno. Ma sembra strano che MongoTemplate abbia una tale diversità di opzioni (non riesco nemmeno a capire quale sia la differenza tra un salvataggio e un upsert), ma i repository di Spring Data sono così limitati.

Pensate che sia inutile/pigro usare Spring Data MongoRepositories senza personalizzarne i metodi se si sta usando la semantica di creazione/aggiornamento, o è la differenza tra un get + null check + repository.save vs a mongoTemplate.insert troppo irrilevante per preoccuparsi?

risposta

0

Spring Data segue repository pattern. Repository è un'astrazione sul livello DAO e serve per l'archiviazione e il recupero generico di entità di dominio. Nella parte inferiore del livello del repository è presente la parte del livello DAO dove è utilizzato lo MongoTemplate.

Quindi il metodo di salvataggio logico è Repository. Dal punto di vista del dominio, non ci si deve preoccupare di come l'entità del dominio sia persistente. È sufficiente chiamare il metodo di salvataggio e l'utilizzo di MongoTemplate dipende dall'implementazione di MongoRepository.

3

È possibile personalizzare il proprio repository utilizzando XXXRepositoryCustom e scrivendo un'implementazione per esso.

Ecco un esempio:

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

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

} 

Avviso interfaccia di cui sopra si estende la propria interfaccia AccountRepositoryCustom.

quindi definire il proprio AccountRepositoryCustom:

public interface AccountRepositoryCustom { 

    public boolean updateAccountToken(String id, String token); 

} 

Avanti, scrivere un'implementazione per esso:

public class AccountRepositoryCustomImpl implements AccountRepositoryCustom { 

    @Autowired 
    private MongoTemplate mongoTemplate; 

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

Sì, l'ho già fatto. Ma questo è un sacco di codice boilerplate da scrivere per ottenere un aggiornamento e un metodo di creazione quando il punto principale dei repository di Spring Data è quello di ridurre il codice boilerplate IMO. – CorayThan