2010-02-20 41 views
1

我有两个类之间的父子关系,但子对象从不存储。我得到一个警告:如何使用来自Scala的JDO在GAE上存储子对象

“org.datanucleus.store.appengine.MetaDataValidator checkForIllegalChildField:无法验证关系net.vermaas.kivanotify.model.UserCriteria.internalCriteria”

但我不清楚为什么这个发生。已经尝试了几种替代品,但没有运气

父类是“UserCriteria”,它具有“Criteria”列表作为子项。

的类定义如下(斯卡拉):为什么不存储

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 
    } 
} 

任何想法的孩子的?或者为什么我收到错误信息?

感谢, 吕

回答

0

它看起来像你对我试图实现一个owned one-to-many relationship。您似乎也忘记了UserCriteria的internalCriteria字段的@Embedded批注,尽管我认为它可能仍然不起作用,因为该字段包含列表而不是嵌入类本身。