1

別のオブジェクト内にあるオブジェクト内にあるフィールドを取得するのに問題があります。いくつかのフィールドを取得できますが、他のフィールドは取得できません。

これは、このエラーを再現するために作成したテストです。

public void commentTest(){
    try {
        new MyUser("mauri@mail.com","Maurizio Pozzobon","01","facebook","hash").insert();
    } catch (Exception e) {}
    MyUser user = MyUser.findByEmail("mauri@mail.com");
    Place place = new Place(user,"posto","bel posto",null,null);
    place.insert();
    assertNotNull(user);
    Event e =new Event(user,place, "Festa","Questa è una gran bella festa",null,new Date(),(long) 10,false,null);
    e.insert();
    assertNotNull(user.nome);
    EventComment ec = new EventComment(user, e, "TestComment", new Date());
    ec.insert();
    List<EventComment> ecs = e.comments.fetch();
    for (EventComment comment : ecs) {
        assertNotNull(comment.user.id);
        MyUser us= MyUser.findById(comment.user.id);
        assertNotNull(us.nome);
        assertNotNull(comment.user.nome);
    }
} 

ラインで失敗する

assertNotNull(comment.user.nome);

DBへの他の呼び出しを行ってそのフィールドに到達できるので、これは契約違反ではありませんが、一部のフィールドにアクセスでき、他のフィールドにアクセスできないのは奇妙に思えます

MyUser で、次の注釈を付けて、または付けずに「nome」フィールドを宣言しようとしました

@Column("nome")
@Max(200) @NotNull
public String nome;
4

1 に答える 1

0

いいえ、基本的にはこれが正常です。
あなたはGAEを使っていますよね?
GAE では、SQL DB のような JOIN がないことに注意してください。
コメントを取得すると、リンクされたユーザーは完全には取得されず、user.id フィールドのみが入力されます。だからassertNotNull(comment.user.id)OKです。
したがって、デフォルトでは、ユーザーをコメントに関連付けるには、手動で取得する必要があります。

この制限は、エンティティのグループ化と、リンクされたエンティティを自動的に取得する新しいアノテーション @Join をまもなく提供する予定であるため、すぐに変更されるはずです。

このアノテーションは既に試すことができますが、まだ完成していません。コメント クラスに @Join を追加します。

@Join
@Column("user")
User user;

次に、1 つのコメントを取得すると、そのユーザーも取得されます。

Comment comment = Comment.findById("id", value);  
assertNotNull(comment.user.nome); // will be OK.

ただし、次の場合は機能しません。List<EventComment> ecs = e.comments.fetch();
この結合ははるかに複雑であり、エンティティのグループ化が行われるまで、カーテンの後ろで大量のリソースを消費します。

于 2011-05-29T11:01:08.913 に答える