Spring Data MongoDb für die Klassenvererbung
Möchte ich zum speichern verschiedener Daten, um eine Sammlung in MongoDb und Spring data Bohnen mit dem entsprechenden Feld..
Sorry, hab ich übersprungen details.
Übergeordneten bean:
class A
int a
Childs:
class B extends A
double b
class C extends A
String c
Also, es gibt folgende Dokument in mongo
{a : 1, b : 2.3, c : "Test"}
Wenn ich Daten abrufen, ist es ok. Aber, wenn ich rufe speichern Methode von CrudRepository für B, es überschreibt alle Daten und ich verliere C.
Ich kenne nur eine gute option, um benutzerdefinierte Methode speichern mit inkrementellen updates, wie
update.set("b", newvalue)...
aber mit Reflexion.
Haben Sie andere Ideen?
Vielen Dank im Voraus.
- Würden Sie bitte ein wenig Ausführlicher auf die Interaktion mit
MongoTemplate
und Ihr repository? Lesen Sie die Daten zurück in ein ObjektB
? Das sollte bei der tatsächlichen Rückgabe ein Objekt vom TypC
wie wir feststellen sollten die gespeicherten Informationen. Darüber hinaus ist das collection-mapping-Informationen wäre hilfreich. Stellen Sie sicher, dass alle Klassen zugeordnet, die die gleiche Sammlung. - Hallo Oliver, danke für deine Antwort. Ja, ich habe überschreiben 'speichern' Methode 'MongoTemplate' update-Abfrage. Wenn ich jetzt speichern', B', aktualisiert er nur die " B " - Felder. Aber ich versuche zu finden, mehr awesome Lösung...
- Wenn Sie hinzufügen der entsprechenden code-Schnipsel könnten wir Tauchen in das Thema ein bisschen mehr 🙂
- Hallo Oliver, sorry für die Verspätung der Antwort. Es ist unsere Lösung: gist.github.com/1631780
- vielen Dank für all die harte Arbeit! 1.0.1.RELEASE behoben viele Problem für mich
Du musst angemeldet sein, um einen Kommentar abzugeben.
Für den Frühling-Daten MongoTemplate, in dem Sie zusätzliche Felder in das Objekt, ein
zusätzliches Feld name _class auch gespeichert, was sagt die Vorlage, die Klasse zu speichern.
Sie können nicht speichern Sie ein Objekt ordnungsgemäß mit einem anderen Objekt in das repository, unabhängig der erbschaft-Beziehung.
Den CrudRepository für das Frühjahr ist im wesentlichen die Generische Dao-Muster. Da alle Ihre dao die das interface implementieren und die Methode speichern, werden Sie in der Lage zu speichern, die von dem Objekt wissen, das dao zu verwenden.
Um dies zu tun, erstellen Sie eine RepositoryFactory die verwendet werden, um anfängliche repository, bietet eine getRepository(Klasse Typ) - Funktion, die Sie mit dem entsprechenden repository für Ihre Klasse. Dann werden Sie in der Lage, etwas zu tun:
Finden Sie weitere Details hier: http://www.rainydayinn.com/dev/dao-factory-and-generic-dao-wiring-in-spring/
Wenn Sie möchten, speichern Sie alle Ihre Objekte in der gleichen Sammlung, können Sie mit der annotation @Document (collection="mycollection"). Wenn Sie nicht geben Sie einen Namen für die Sammlung ein, die Voreinstellung ist, speichern Sie jede Klasse in einer separaten Auflistung nach name der Klasse.