2010-09-28 6 views
0

Je reçois l'erreur ci-dessous tout en essayant de persister un objet qui a une collection d'interfaces que je veux contenir un couple de différents types d'objets. Il semble se passer presque au hasard. Parfois, après le redémarrage, ça marche bien (je fais peut-être quelque chose de mal quand même).Problème persistant collection d'interfaces dans JDO/Datanucleus. "impossible d'affecter un objet de type .."

class CommentList { 

@Persistent 
@Join 
ArrayList<IComment> = new ArrayList<IComment>(); 

} 

un autre endroit ...

CommentList cl = new CommentList(); 

cl.addComment(new SimpleComment()); 
cl.addComment(new SpecialComment()); 

repo.persist(cl); 

Je peux voir la table de jointure a été créé dans mon DB ainsi que les champs d'identification pour chacune des classes de mise en œuvre de iComment.

SimpleComment et SpecialComment implémentent IComment. Si je viens d'ajouter un simple commentaire, cela fonctionne très bien. Dès que je commence à essayer d'ajouter d'autres types d'objets, je commence à avoir des erreurs.

erreur im se

java.lang.ClassCastException: Field "com.myapp.model.CommentList.comments" is a reference field (interface/Object) of type com.myapp.behaviours.IComment but DataNucleus is unable to assign an object of type "com.myapp.model.ShortComment" to this field. You can only assign this field to a type specified by the "implementation-classes" extension attribute. 
at org.datanucleus.store.mapped.mapping.MultiMapping.setObject(MultiMapping.java:220) 
at org.datanucleus.store.mapped.mapping.ReferenceMapping.setObject(ReferenceMapping.java:526) 
at org.datanucleus.store.mapped.mapping.MultiMapping.setObject(MultiMapping.java:200) 
at org.datanucleus.store.rdbms.scostore.BackingStoreHelper.populateElementInStatement(BackingStoreHelpe 
r.java:135) 
at org.datanucleus.store.rdbms.scostore.RDBMSJoinListStoreSpecialization.internalAdd(RDBMSJoinListStore 
Specialization.java:443) 
at org.datanucleus.store.mapped.scostore.JoinListStore.internalAdd(JoinListStore.java:233) 

Quand il ne sauve, si je redémarre le serveur et essayer d'interroger pour obtenir une liste des commentaires, je reçois des valeurs nulles renvoyées. J'utilise mysql backend - si je passe à db4o cela fonctionne très bien.

S'il vous plaît laissez-moi savoir si des informations seraient utiles.

Si vous avez une idée d'où je pourrais me tromper ou si je peux fournir un exemple de code pour la collecte persistante de différents objets implémentant la même interface qui serait appréciée.

Merci pour toute aide.

Tom

Répondre

0

je fixe en spécifiant

<extension implemention-classes="SimpleComment SpecialComment"/> 

pour le champ cl dans mon pacakge.jdo.

0

Quand je interfaces je viens de permis dynamicSchemaUpdates (certains biens de la persistance avec un nom comme ça) et FK recherche sont ajoutés en cas de besoin. Le journal donne tous SQL Je pense que

Questions connexes