开发者

Can't get a string field from an object in another object in siena

开发者 https://www.devze.com 2023-03-09 10:46 出处:网络
I\'m having trouble getting a field which is in an object which is inside another object. I can get some fields, but others no.

I'm having trouble getting a field which is in an object which is inside another object. I can get some fields, but others no.

This is the test I created to reproduce this error.

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.use开发者_C百科r.nome);
    }
} 

It fails at the line

assertNotNull(comment.user.nome);

This isn't a deal breaker since I still can get to that field doing other calls to the DB, but it seems weird I can access some fields and others can't

In MyUser I tried both declaring the 'nome' field with and without the following annotations

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


No basically, this is normal.
You use GAE, am I right?
In GAE, remember that there is no JOIN as in SQL DB.
When you fetch a comment, the linked user is not fetched entirely but only the user.id field is filled. That's why assertNotNull(comment.user.id) is OK.
So, by default, if you want the user associated to a comment, you need to fetch it manually.

This limitation should change soon as we are going to provide entity grouping very soon and also a new annotation @Join that will fetch the linked entity(ies) automatically.

You can already try this annotation but it's not yet finalized. In your comment class, add the @Join :

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

Then when you fetch one comment, it will also fetch the user with it.

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

But it shouldn't work in the case : List<EventComment> ecs = e.comments.fetch();
This join is much more complicated and until we have entity grouping, it would consume too much resources behind the curtain.

0

精彩评论

暂无评论...
验证码 换一张
取 消