使用JPA在GAE中保存许多实体

时间:2010-11-22 22:23:49

标签: java google-app-engine jpa entity

我正在将JPA与Google App Engine结合使用。 假设我有一个非常简单的@Entity,它由一个Key和一个String组成,仅此而已。我现在创建10000个这样的实体,将它们放在一个列表中,现在想要存储所有这些实体。

如果我尝试使用EntityManager em 和for循环来浏览我所有实体的 List ......

for(MyEntity entity : listOfAllEntities) {
 em.persist(entity);
}

..我将收到IllegalArgumentException:

  

java.lang.IllegalArgumentException:无法在单个事务中对多个实体组进行操作。

据我了解,我需要为每个persist()调用关闭并重新打开EntityManager。当然,这非常耗时。 我正在尝试每天运行一次重新加载所有实体的任务。根据GAE政策,任务的超时时间为30秒。

所以另一种方法是一次只保存500个实体并多次运行任务,我认为这比实际情况要复杂得多。

这是实现我想要做的事情的唯一方法,还是我在这里遗漏了什么?

解决方案: 所有答案都指向同一个方向。我只是通过创建一个“虚拟父”实体来创建一对多关系。在我的情况下,我真的不需要父母,而且在现实世界中它没有多大意义。但是在将这个虚拟实体设置为每个子实体的父实体后,我可以像以前那样完全保存它们,而不必过多关注事务。谢谢大家。

2 个答案:

答案 0 :(得分:4)

这可能过于简单了,但您可以将X个实体添加为父实体的子项,这将导致它们位于同一个实体组中。这将允许您在一个事务中将它们全部保留。基本上,在父实体和孩子之间创建一个拥有的一对多关系,这些关系是你试图坚持的对象。

答案 1 :(得分:1)

此错误表示您使用事务并尝试对多个实体组进行操作。

来自docs:

  

事务中的所有数据存储区操作都必须对同一实体组中的实体进行操作。这包括由祖先查询实体,按键检索实体,更新实体和删除实体。请注意,每个根实体都属于一个单独的实体组,因此单个事务不能在多个根实体上创建或操作。

您不能在事务中创建多个根(没有父实体)实体,但如果每个实体都是另一个实体的子实体,则可以执行此操作。如果您只想创建实体 - 在事务之外完成。