2013-07-18 7 views
11

Sono abbastanza nuovo per mongodb e morfina, dopo aver iniziato ad usarlo, mi rendo conto che c'è una parte in più nel documento mongodb, il record contiene un nome archiviato " ClassName "con valore della classe mappata da morfina.un nome di campo "ClassName" viene inserito in mongodb da morphia

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

è normale? Sento che sta violando l'integrità dei dati nel db, c'è comunque un modo per aggirarlo?

risposta

18

È possibile disattivare in modo esplicito l'attributo className: @Entity(noClassnameStored = true)

sto generalmente sopprimere l'attributo, se v'è una sola classe di entità. Se sto sottoclassi la mia entità, la sto abilitando esplicitamente (che è l'impostazione predefinita, ma per sicurezza).

Se non sbaglio, Morphia è abbastanza intelligente da indovinare la sottoclasse corretta in base alle proprietà anche se non è presente className (basato sulla riflessione). Quindi, se avete un attributo mongoKnowledge nella sottoclasse Developer di persona e la sottoclasse manager non ce l'ha, Morphia saprà che i documenti con mongoKnowledge devono essere di classe Developer. Quindi, strettamente parlando, className è richiesto solo se le sottoclassi hanno gli stessi attributi; tuttavia, non ci farei troppo affidamento.

Non ho provato a rinominare le classi di entità, ma probabilmente causerà problemi. C'è un problema di lunga data per fornire un'annotazione @Polimorphic e per risolvere il problema insieme a questo. Vedi https://code.google.com/p/morphia/issues/detail?id=22

1

Questo è normale. Poiché Morphia supporta Polymorphism, significa che sottoclassi devono essere memorizzate nella stessa collezione dove la super classe è persistente. Per differenziare/filtrare durante l'interrogazione e la memorizzazione, utilizza questo campo. Spero che userai Morphia anche per le query. Come pensi, influisce sull'integrità dei tuoi dati, in quanto potresti facilmente filtrarli.

Ibernazione, dispone di una colonna discriminante per il supporto del polimorfismo.

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

+0

cosa succede se in seguito cambio il nome della classe ?? il refactoring dei nomi avviene abbastanza spesso, devo passare attraverso tutti i record e aggiornarli tutti? – nightograph

+0

Sì, devi – Faliorn

Problemi correlati