我正在使用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为空。
我怎样才能让它发挥作用?
答案 0 :(得分:4)
ID仅在保存时生成,eb
永远不会保存在您的代码中。将ed.id
添加到列表中时,Model.em().getTransaction().commit();
将为空。
编辑:
我的解释会更进一步。
第一个记录器返回1,因为它是一个Java列表对象。它是一个普通的列表,你添加一个元素,大小增加。这里没有惊喜。普通的java。而且绝对与Play无关!
第二个记录器没有显示任何内容,因为ID是在提交时生成的。因为,您仍处于同一事务中,直到执行结束才执行保存。如果您确实希望在同一个http请求/事务中使用它,请使用:
{{1}}
有关详细信息,请查看Transactions上的官方Play文档。