使用JPA从数据库中检索数据

时间:2013-10-15 13:42:11

标签: java jpa

我正在尝试使用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();
    }

2 个答案:

答案 0 :(得分:0)

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

orders.add(order);

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

答案 1 :(得分: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();

在调用之后没有对实体管理器做任何其他事情。