1

这是我的用户类

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)空值加载用户。

我正在使用带有 siena 和 gae 模块的 play 1.1。

知道什么可能是错的吗?我尝试将集合声明为公共并使用列表而不是集合,但没有任何效果。

谢谢

4

1 回答 1

3

我是 Siena 的首席开发人员,问题出在您的模型上。你不能这样声明你们的关系。

首先,您是否希望使用 JSON 序列化将 idEvents 和 idPhotos 直接存储到您的对象中?如果是,您应该使用@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 with 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,并编写大量文档来比现在更好地解释一切;)

如果您有任何问题,请随时问我!

于 2011-05-09T17:16:19.823 回答