0

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 全体をロードするためだと思います。では、この問題を解決する正しい方法は何ですか?

ありがとう。

4

2 に答える 2

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 に答える
0

内部的に objectify がエンティティ「この場合は ChildEntity」を格納する場合、エンティティ自体を格納するのではなく、key「エンティティへの参照」を格納します。List<Key>objectify ハンドル aが宣言されているため、おそらくメソッドが呼び出されることはありません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 に答える