2012-01-09 7 views
9

voglio memorizzare dati diversi per una raccolta in MongoDb e hanno bean di dati di primavera con campo appropriato ..primavera dati MongoDb per la classe eredità

Spiacente, ho dettagli saltati.

Parent di fagioli:

class A 
    int a 

Childs:

class B extends A 
    double b 

class C extends A 
    String c 

Quindi, c'è seguente documento in Mongo

{a : 1, b : 2.3, c : "Test"} 

Quando ho recuperare i dati, è ok. Ma, quando chiamo Salva metodo dal CrudRepository per B, riscrive tutti i dati e perdo C.

Io so solo una buona opzione per creare personalizzato metodo Save con aggiornamenti incrementali, come ad esempio

update.set("b", newvalue)... 

ma con la riflessione.

Avete altre idee?

Grazie in anticipo.

+1

Ti dispiacerebbe essere un po 'più prolisso sull'interazione con 'MongoTemplate' e il tuo repository? Stai leggendo i dati di nuovo in un oggetto di 'B'? Questo dovrebbe in realtà restituire un oggetto di tipo 'C' come dovremmo rilevare le informazioni sul tipo memorizzato. Oltre a ciò, le informazioni sulla mappatura della raccolta sarebbero utili. Assicurati che tutte le classi siano mappate sulla stessa collezione. –

+0

Ciao Oliver, grazie per la tua risposta. Sì, ho ignorato il metodo 'save' di 'MongoTemplate' per utilizzare la query di aggiornamento. Ora quando salvo 'B', aggiorna solo i campi 'B'. Ma cerco di trovare una soluzione più straordinaria ... –

+0

Se aggiungi gli snippet di codice rilevanti potremmo approfondire un po 'il problema :) –

risposta

5

Per Spring-data MongoTemplate, in aggiunta ai campi nell'oggetto, viene salvato anche un nome di campo aggiuntivo _class che indica al modello quale classe sta salvando.
Non è possibile salvare correttamente un oggetto utilizzando il repository di un altro oggetto, indipendentemente da della relazione di ereditarietà.

Il CrudRepository for Spring è essenzialmente il modello di Dao generico. Poiché tutti i tuoi dao implementano l'interfaccia e hanno il metodo di salvataggio, sarai in grado di salvare qualsiasi oggetto sapendo quale dao usare.

Per fare ciò, è possibile creare una RepositoryFactory che viene utilizzata per inizializzare il repository, che offre una funzione getRepository (tipo di classe) che fornisce il repository appropriato per la classe. Allora si sarà in grado di fare qualcosa di simile:

repositoryFactory.getRepository(myType.getClass()).save(myType); 

È possibile trovare maggiori dettagli qui: http://www.rainydayinn.com/dev/dao-factory-and-generic-dao-wiring-in-spring/

Se si desidera memorizzare tutti gli oggetti della stessa collezione, è possibile utilizzare il @Document annotazioni (raccolta = "MyCollection"). Se non si specifica un nome per la raccolta, l'impostazione predefinita è di salvare ogni classe in una raccolta separata in base al nome della classe.

Problemi correlati