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,那么解决这个问题的正确方法是什么?
感谢。
答案 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的官方发布会在您尝试时抛出异常。在过去,它被允许,但正是出于这个原因,结果证明是一个坏主意。