【发布时间】:2011-05-14 03:25:29
【问题描述】:
我将 JPA 与 Google App Engine 结合使用。 假设我有一个非常简单的@Entity,由一个键和一个字符串组成,仅此而已。我现在创建了 10000 个这些实体,将它们放在一个列表中,现在想要存储所有这些实体。
如果我尝试使用 EntityManager em 和 for 循环来遍历我所有实体的 List...
for(MyEntity entity : listOfAllEntities) {
em.persist(entity);
}
.. 我会得到一个 IllegalArgumentException:
java.lang.IllegalArgumentException:不能在单个事务中对多个实体组进行操作。
据我了解,我需要为每个 persist() 调用关闭并重新打开 EntityManager。当然,这是非常耗时的。 我正在尝试每天运行一次重新加载所有实体的任务。根据 GAE 策略,该任务的超时时间为 30 秒。
因此,另一种方法是一次只保存 500 个实体并多次运行该任务,我认为这比它必须的要复杂。
这是实现我想要做的事情的唯一方法还是我在这里遗漏了什么?
解决方案: 所有的答案都指向同一个方向。我只是通过创建“虚拟父”实体来创建一对多关系。在我的情况下,我真的不需要父母,可以这么说在现实世界中没有多大意义。但是在将这个虚拟实体设置为每个子实体的父实体之后,我可以像以前一样保存它们,而无需过多关心事务。谢谢大家。
【问题讨论】:
-
Read the answer to this similar question。听起来与您遇到的问题相同。
-
是的,那是我的问题。我通过添加一个父实体然后拥有一个拥有的一对多关系来修复它,因此它们位于同一个实体组中。
-
感谢您的链接。不确定我是否可以在我的案例中应用选择的答案,但我会看看它。
-
哇,这太奇怪了。很好的问答。
-
@socken23 对不起,我遇到了同样的错误。你能展示一些代码sn-p如何做到这一点吗?我试图更新从 1 个父类扩展的实体列表,但仍然出错。
标签: java google-app-engine jpa entity