使用Play Framework和JPA </long>的List <long>问题

时间:2011-07-11 08:50:08

标签: java list jpa playframework

我正在使用Play!Framework开发一个项目,而我正在使用JPA来解决一些问题。它似乎没有保存我的列表,或者无法从数据库中检索它。

这是我的用户类:

@Entity
public class User extends Model {
    public String login;
    public String password;
    public String name;
    public String email;
    @ElementCollection
    public List<Long> eventStreamIds;
    @Transient
    UserEventBuffer eventBuffer;

    public User(String login, String password, String name, String email, ArrayList<Long> eventStreamIds) {
        this.login = login;
        this.password = password;
        this.name = name;
        this.email = email;
        this.eventStreamIds = eventStreamIds;
            UserEventBuffer eventBuffer = new UserEventBuffer();
        }
}

我有另一个类,一个ModelManager,其构造函数如下:

public ModelManager() {
    User u = new User("user1", "pwd", "Alex", "test@test.com");
    EventStreamMC eb = new EventStreamMC("http://www.wservice.com/stream1");
    streams.add(eb);
    u.eventStreamIds.add(eb.id);
    Logger.info("before : " + u.eventStreamIds.size());
    u.save();
    User u2 = User.find("byLoginAndPassword", "user1", "pwd").first();
    Logger.info("after : " + u2.eventStreamIds.size());
}

(我的EventStreamMC还扩展了Model并有一个@Entity标记,因此它的Long id会自动生成) 当我运行此代码时,结果如下:

before = 1
after = 0

因此,在调用find()方法后,List为空。

我怎样才能让它发挥作用?

1 个答案:

答案 0 :(得分:4)

ID仅在保存时生成,eb永远不会保存在您的代码中。将ed.id添加到列表中时,Model.em().getTransaction().commit(); 将为空。

编辑:

我的解释会更进一步。

第一个记录器返回1,因为它是一个Java列表对象。它是一个普通的列表,你添加一个元素,大小增加。这里没有惊喜。普通的java。而且绝对与Play无关!

第二个记录器没有显示任何内容,因为ID是在提交时生成的。因为,您仍处于同一事务中,直到执行结束才执行保存。如果您确实希望在同一个http请求/事务中使用它,请使用:

{{1}}

有关详细信息,请查看Transactions上的官方Play文档。