javaplayframeworksiena

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


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.user.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;

Solution

  • 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.