【问题标题】:Issue with a List<Long> using PlayFramework and JPA使用 PlayFramework 和 JPA 的 List<Long> 问题
【发布时间】:2011-07-11 08:50:08
【问题描述】:

我正在使用 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 为空。

我怎样才能让它工作?

【问题讨论】:

  • 如果您只是查看数据库会容易得多,这样您就知道问题是保存还是查找。例如,如果您有 2 个使用 pwd 的 user1,它将无法正常工作。
  • 如何在开发模式下查看数据库?
  • 简单使用真实数据库。您甚至可以尝试模块console。确保您的事务已提交。

标签: java list jpa playframework


【解决方案1】:

ID 仅在保存时生成,eb 永远不会保存在您的代码中。当您将ed.id 添加到您的列表中时,ed.id 将为空。

编辑:

我会进一步解释。

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

第二个记录器没有显示任何内容,因为 ID 是在提交时生成的。而且,由于您仍在同一个事务中,因此在执行结束之前不会执行任何保存。如果您真的希望它在同一个 http 请求/事务中工作,请使用:

Model.em().getTransaction().commit();

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

【讨论】:

  • 那么,你如何解释第一个 Logger.info() 返回 1 ?
  • 好的,eb.id 实际上是空的,但无论如何我认为它应该被保存为空值。我在 e.eventStreamIds.add(eb.id) 之前添加了一个 eb.save(),但结果相同,在 find() 之后,列表仍然是空的 :(
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-12-27
  • 1970-01-01
  • 2012-01-17
  • 2013-05-08
  • 1970-01-01
  • 2011-04-10
  • 1970-01-01
相关资源
最近更新 更多