Постоянство Play Gae не работает для Set <Long> - PullRequest
1 голос
/ 09 мая 2011

Это мой класс пользователя

public class User extends Model {

@Id
public Long id;

public String nome;
public String email;
public String webId;    //ID of the user in the provider website
public String passwordHash;
public String service;

//Relazioni
private Set<Long> idEvents = new HashSet<Long>();
...
private Set<Long> idPhotos= new HashSet<Long>();


public User(String email, String name,String webId, String passwordHash, String service) throws Exception {
    ...
}

static Query<User> all() {
    return Model.all(User.class);
}

public static User findByEmail(String email){
    return all().filter("email", email).get();
}
}

Когда я создаю его и вставляю в базу данных, кажется, что он работает нормально. Но потом, когда я вызываю его из БД, использую findByEmail (email). Он загружает пользователя со всеми наборами (например, idEvents), равными нулю.

Я использую play 1.1 с модулями siena и gae.

Есть идеи, что может быть не так? Я попытался объявить наборы общедоступными и использовать список вместо набора, но ничего не получалось.

Спасибо

1 Ответ

3 голосов
/ 09 мая 2011

Я ведущий разработчик Сиены, и проблема в вашей модели.Вы не можете объявить свое отношение таким образом.

Прежде всего, вы хотите, чтобы ваши idEvents и idPhotos сохранялись непосредственно в вашем объекте с использованием сериализации JSON?Если да, вы должны использовать @Embedded:

@Embedded
public List<Long> idEvents;

. В этом случае idEvents извлекаются автоматически, когда вы делаете:

List<User> users = User.all()...fetch();

Если нет, вам следует использовать автоматические запросыэто простой способ создать отношение Many2One в Сиене.По сути, вы создадите связь между пользователем и событием (я полагаю, у вас уже есть этот класс)

@Filter("owner")
public Query<Event> events; // this is called an "automatic-query"

Если вы не используете новую версию Siena с play (v1.0.0 в настоящее время тестируется)с помощью Play) вы будете использовать следующий код, поскольку в GAE нет JOIN, и вам придется получать связанные сущности вручную:

User user = someUser();
List<User> theEvents = user.events.fetch();

Это объяснено глобально: http://www.sienaproject.com/documentation-getting-started.html

В последние дни Сиена подвергается глубокому рефакторингу: она улучшается, а также дополняется множеством новых функций.Текущая версия - версия 1.0.0_b2.
Я надеюсь, что мы скоро выпустим финальную версию 1.0.0 и напишем много документов, чтобы объяснить все немного лучше, чем сейчас;)

Если у вас есть какие-либо вопросы,не стесняйтесь спрашивать меня!

...