Objectify中的模式迁移:AlsoLoad List <entity>没有返回“整个”实体</entity>

时间:2012-10-05 14:10:38

标签: java google-app-engine objectify

Objectify4 + 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,那么解决这个问题的正确方法是什么?

感谢。

2 个答案:

答案 0 :(得分:0)

在内部,当客体存储一个Entitity “在这种情况下,ChildEntity”它不存储实体本身,而是存储key“对实体的引用”。可能你的方法永远不会被调用,因为objectify处理List<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() );
        }
    }

答案 1 :(得分: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的官方发布会在您尝试时抛出异常。在过去,它被允许,但正是出于这个原因,结果证明是一个坏主意。