0

物化4+GAE 1.7.1

迁移前:实体有一个字段:

@Load
List<ChildEntity> children=new ArrayList<ChildEntity>();

现在我想删除这个字段,而是使用:

 List<String> childrenNames=new ArrayList<String>();

根据Objectify doc,我使用以下方法:

    void importPreviousChildren( @AlsoLoad( "children" ) List<ChildEntity> children )
    {
        for( ChildEntity c: children )
        {
            if( !childrenNames.contains( c.getName() ) )
                childrenNames.add( c.getName() );
        }
    }

但是,结果是 childrenNames 字段只包含“null”。我猜原因是,加载孩子时它确实加载了整个 ChildEntity,那么解决这个问题的正确方法是什么?

谢谢。

4

2 回答 2

0

在内部,当 objectify 存储“在这种情况下为 ChildEntity”的实体时,它不存储实体本身,而是存储key“对实体的引用”。可能永远不会调用您的方法,因为 objectify 处理 aList<Key>并且您已声明List<ChildEntity>.

你可以试试这段代码:

 void importPreviousChildren( @AlsoLoad( "children" ) List<Key> children )
    {
        for( Key key: children )
        {
            ChildEntity c = ofy().load().entity(DatastoreService.get(key))

            if( !childrenNames.contains( c.getName() ) )
                childrenNames.add( c.getName() );
        }
    }
于 2012-10-05T14:57:45.617 回答
0

试试这个:

void importPreviousChildren( @Load @AlsoLoad( "children" ) List<ChildEntity> children )
{
    for( ChildEntity c: children )
    {
        if( !childrenNames.contains( c.getName() ) )
            childrenNames.add( c.getName() );
    }
}

注意额外的 @Load 注释。您正在加载“部分”实体 - 只是关键字段。没有@Load 你不应该再使用具体的引用了;如果您尝试,Objectify4 的官方版本将引发异常。过去它是允许的,但正是由于这个原因,它被证明是一个坏主意。

于 2012-10-05T17:24:50.807 回答