0

我正在尝试使用 JPA。我非常卡住。我正在尝试从数据库中检索数据以显示在表单上。我不断收到以下错误,我在网上找到的信息都没有帮助:

java.util.ConcurrentModificationException

发生错误的代码如下:

try
    {
        em.getTransaction().begin();
        Query q = em.createQuery("Select o from Order o");
        @SuppressWarnings("unchecked")
        List<Order> orders = q.getResultList();
        Iterator<Order> iterator = orders.iterator();
        while(iterator.hasNext())
        {
            Order order = (Order)iterator.next();

            order.setId(this.id);
            order.setCreated(this.created);
            order.setSender(this.sender);
            order.setReceiver(this.receiver);
            order.setInput(this.input);
            order.setOutput(this.output);
            order.setState(this.state);
            orders.add(order);
        }
        em.persist(orders);
        em.getTransaction().commit();
    }
4

2 回答 2

0

您在添加导致问题的列表时正在循环列表。

orders.add(order);

创建一个新列表并向其中添加订单,然后保留该新列表。

于 2013-10-15T13:44:20.487 回答
0

您不能将元素添加到您正在迭代的更正中。(您正在使用 orders.iterator() 对订单进行迭代,然后您尝试在迭代器的主体中执行 orders.add(order)。)

无论如何,整个构造是无用的。只需更改 中对象的属性,orders更改将自动保存到数据库commit()中。最后但并非最不重要的一点是,您应该在for那里使用扩展。

for (Order order : (List<Order>) q.getResultList()) {
    order.setId(...);
    // ...
}
em.getTransaction().commit();

通过评论,您只是试图从数据库中检索现有记录,而不是添加或修改其中的任何内容。在这种情况下,您只需将结果返回getResultList()到 GUI:

return (List<Order>) q.getResultList();

在那次通话之后,无需与实体管理器做任何其他事情。

于 2013-10-15T13:46:14.913 回答