2013-07-18 14 views
11

Ich bin ziemlich neu zu mongodb und Morphium, nachdem ich damit angefangen habe, merke ich, dass es einen zusätzlichen Teil in mongodb Dokument gibt, der Datensatz enthält einen archivierten Namen " ClassName "mit dem Wert der Klasse, die Morphia zugeordnet hat.ein Feldname "ClassName" wird in mongodb von Morphia eingefügt

{ "_id" : ObjectId("51e7a85e300441e5885316c0"), "className" : "models.User", "imgurl" : "", "uname" : "alex"} 

ist das normal? Ich fühle, dass es die Integrität der Daten in der db verletzt, gibt es sowieso um es zu umgehen?

Antwort

18

Sie können das className Attribut explizit deaktivieren: @Entity(noClassnameStored = true)

ich das Attribut im Allgemeinen bin zu unterdrücken, wenn es eine einzige Einheit Klasse. Wenn ich meine Entität unterklassiere, aktiviere ich sie explizit (was der Standard ist, aber um sicher zu gehen).

Wenn ich mich nicht irre, ist Morphia schlau genug, die richtige Unterklasse basierend auf den Eigenschaften zu erraten, auch wenn es keine className (basierend auf Reflexion) gibt. Also, wenn Sie ein Attribut mongoKnowledge in der Unterklasse Entwickler von Person und Unterklasse -Manager es nicht haben, werden Morphia wissen, dass Dokumente mit mongoKnowledge der Klasse Entwickler sein muss. Genau genommen ist className nur erforderlich, wenn Ihre Unterklassen die gleichen Attribute haben; Ich würde mich jedoch nicht zu sehr darauf verlassen.

Ich habe nicht versucht, die Entity-Klassen umzubenennen, aber es wird wahrscheinlich Probleme verursachen. Es gibt ein lang bestehendes Problem, eine Annotation @Polimorphic bereitzustellen und es zusammen damit zu beheben. Siehe https://code.google.com/p/morphia/issues/detail?id=22

1

Das ist normal. Da Morphia Polymorphismus unterstützt, sollten Unterklassen in derselben Sammlung gespeichert werden, in der die Superklasse beibehalten wird. Um bei der Abfrage und Speicherung zu differenzieren/filtern, verwendet es dieses Feld. Hoffe, du würdest Morphia auch zum Abfragen verwenden. Wie denken Sie, beeinflusst dies die Integrität Ihrer Daten, wie Sie es leicht herausfiltern können.

Hibernate auch, hat Diskriminator Spalte für die Unterstützung von Polymorphie.

http://docs.jboss.org/hibernate/core/3.3/reference/en/html/mapping.html#mapping-declaration-discriminator

+0

was passiert, wenn ich später den Namen der Klasse ändern? Refactoring von Namen passiert ziemlich oft, muss ich alle Datensätze durchgehen und sie alle aktualisieren? – nightograph

+0

Ja, du musst – Faliorn

Verwandte Themen