我正在尝试使用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();
}
答案 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();
在调用之后没有对实体管理器做任何其他事情。