2010-02-20 4 views
1

J'ai une relation parent-enfant entre 2 classes, mais les objets enfants ne sont jamais stockés. Je reçois un avertissement:Comment stocker des objets enfants sur GAE en utilisant JDO de Scala

« org.datanucleus.store.appengine.MetaDataValidator checkForIllegalChildField: Impossible de valider la relation net.vermaas.kivanotify.model.UserCriteria.internalCriteria »

mais il me ne sait pas pourquoi ce se produit. Déjà essayé plusieurs alternatives sans chance.

La classe parente est "UserCriteria" qui a une liste de "Critères" en tant qu'enfants.

Les classes sont définies comme suit (Scala):

class UserCriteria(tu: String, crit: Map[String, String]) extends LogHelper { 
    @PrimaryKey 
    @Persistent{val valueStrategy = IdGeneratorStrategy.IDENTITY} 
    var id = KeyFactory.createKey("UserCriteria", System.nanoTime) 

    @Persistent 
    var twitterUser = tu 

    @Persistent 
    var internalCriteria: java.util.List[Criteria] = flatten(crit) 

    def flatten(crits: Map[String, String]) : java.util.List[Criteria] = { 
    val list = new java.util.ArrayList[Criteria] 
    for (key <- crits.keySet) { 
     list.add(new Criteria(this, key, crits(key))) 
    } 
    list 
    } 

    def criteria: Map[String, String] = { 
    val crits = mutable.Map.empty[String, String] 

    for (i <- 0 to internalCriteria.size-1) { 
     crits(internalCriteria.get(i).name) = internalCriteria.get(i).value 
    } 

    Map.empty ++ crits 
    } 

    // Stripped the equals, canEquals, hashCode, toString code to keep the code snippet short... 
} 

@PersistenceCapable 
@EmbeddedOnly 
class Criteria(uc: UserCriteria, nm: String, vl: String) { 

    @Persistent 
    var userCriteria = uc 

    @Persistent 
    var name = nm 

    @Persistent 
    var value = vl 

    override def toString = { 
    "Criteria name: " + name + " value: " + value 
    } 
} 

Toutes les idées pourquoi les Childs ne sont pas stockés? Ou pourquoi je reçois le message d'erreur?

Merci, Gero

Répondre

0

Il me semble que vous essayez de mettre en œuvre un owned one-to-many relationship. Aussi, vous semblez avoir oublié l'annotation @Embedded pour le champ internalCriteria de UserCriteria, bien que je pense que cela pourrait ne pas fonctionner puisque le champ contient une liste et non la classe incorporée elle-même.