Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用JPA从数据库检索数据_Java_Jpa - Fatal编程技术网

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

Java 使用JPA从数据库检索数据,java,jpa,Java,Jpa,我正在努力掌握如何使用JPA。我被卡住了。我试图从数据库中检索数据以显示在表单上。我不断收到以下错误,但我在网上找到的信息都没有帮助: java.util.ConcurrentModificationException 发生错误的代码如下所示: try { em.getTransaction().begin(); Query q = em.createQuery("Select o from Order o"); @SuppressWarn

我正在努力掌握如何使用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();
    }
试试看
{
em.getTransaction().begin();
Query q=em.createQuery(“从订单o中选择o”);
@抑制警告(“未选中”)
列表顺序=q.getResultList();
迭代器迭代器=orders.Iterator();
while(iterator.hasNext())
{
Order Order=(Order)迭代器.next();
order.setId(this.id);
order.setCreated(this.created);
order.setSender(本发送方);
order.setReceiver(此.receiver);
order.setInput(this.input);
order.setOutput(this.output);
order.setState(本状态);
订单。添加(订单);
}
em.persist(订单);
em.getTransaction().commit();
}

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

订单。添加(订单)


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

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

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

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

在该调用之后,不使用实体管理器执行任何其他操作。

在执行迭代时,您正在修改[orders.add(order);]集合(orders)。另外,为什么要尝试更改数据库中所有订单的
id
?这可能会做些傻事。99%的情况下,实体的主键在其生存期内不应更改。你的代码要完成什么?还有,真的,你的文档怎么没有解释你得到它的原因?我想是的,我想我理解了,所以我在其他论坛和网站上实施了建议的更改来解决它,但没有任何效果,所以我想我一定是误解了它。因此,来寻求你们的帮助,因为人们总是看起来很有知识,很有帮助。对不起,我对JPA等相当陌生。我已经在迭代上面创建了列表顺序。我应该在哪里创建一个新列表,我应该在哪里添加它?在循环之前创建一个新列表这不是一个JPA问题,而是一个普通Java问题。在开始循环之前创建新列表。
list orders=q.getResultList();列表顺序2=null;迭代器迭代器=orders.Iterator();while(iterator.hasNext()){Order=(Order)iterator.next();Order.setId(this.id);Order.setCreated(this.created);Order.setSender(this.sender);Order.setReceiver(this.receiver);Order.setInput(this.output);Order.setState(this.state);orders2.add(Order);}em.persist(orders2)是,除了创建一个新的ArrayList实例,否则它将抛出一个NPE。只是澄清一下,这应该是从数据库中检索数据,而不是将其保存到数据库中。因此,对于每一行,id都会被设置为不同的id,就像在数据库中一样。检索数据时,我这样做是否完全错误?如果是这样的话,你能告诉我正确的方法吗?另外,如果我使用你回答中所述的代码,我会在q.getResultList()上发现类型不匹配:(@DannyBoy My bad,你只需要在那里进行转换。@DannyBoy同样,在你的代码中,你不仅仅是在检索数据,你似乎也在以一种非常可疑的方式修改它。(更改每个
订单
,并修改
id
)如果不知道最终要完成什么,我无法告诉您是否做错了。例如,数据库的原始内容是什么,以及代码运行后希望它们是什么。
return (List<Order>) q.getResultList();