Не удается получить строковое поле из объекта в другом объекте в Сиене - PullRequest
1 голос
/ 28 мая 2011

У меня проблемы с получением поля, которое находится в объекте, который находится внутри другого объекта. Я могу получить некоторые поля, но другие нет.

Это тест, который я создал, чтобы воспроизвести эту ошибку.

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);

Это не прерывает сделки, поскольку я все еще могу добраться до этого поля, делая другие вызовы БД, но кажется странным, что я могу получить доступ к некоторым полям, а другие не могут

В MyUser я попробовал как объявить поле 'nome' со следующими аннотациями и без них

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

1 Ответ

0 голосов
/ 29 мая 2011

Нет, в принципе, это нормально.
Вы используете GAE, я прав?
В GAE помните, что нет JOIN, как в SQL DB.
Когда вы выбираете комментарий, связанный пользователь выбирается не полностью, а заполняется только поле user.id. Вот почему assertNotNull(comment.user.id) в порядке.
Таким образом, по умолчанию, если вы хотите, чтобы пользователь связался с комментарием, вам нужно получить его вручную.

Это ограничение должно скоро измениться, так как мы собираемся очень скоро предоставить группировку объектов, а также новую аннотацию @Join, которая будет автоматически извлекать связанные объекты.

Вы уже можете попробовать эту аннотацию, но она еще не завершена. В своем классе комментариев добавьте @Join:

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

Затем, когда вы получите один комментарий, он также получит с ним пользователя.

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

Но это не должно работать в случае: List<EventComment> ecs = e.comments.fetch();
Это объединение намного сложнее, и до тех пор, пока у нас не будет группировка сущностей, оно будет потреблять слишком много ресурсов за занавесом.

...