2010-11-22 8 views
6

Estoy usando JPA con Google App Engine. Digamos que tengo una @Entidad muy simple que consiste en una clave y una cadena, nada más. Ahora creo 10000 de estas entidades, las pongo en una lista y ahora quiero almacenarlas todas.Guardando muchas entidades en GAE con JPA

Si trato de usar un EntityManager em y un bucle for para recorrer la lista de todos mis entidades ...

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

.. voy a tener una IllegalArgumentException:

java.lang.IllegalArgumentException: no puede operar en múltiples grupos de entidades en una sola transacción.

Por lo que tengo entendido, tengo que cerrar y volver a abrir el EntityManager para cada llamada persist(). Por supuesto, esto consume mucho tiempo. Estoy tratando de ejecutar una tarea una vez al día que vuelva a cargar todas las entidades. De acuerdo con la política de GAE, la tarea tiene un tiempo de espera de 30 segundos.

Así que una alternativa es guardar solo 500 entidades a la vez y ejecutar la tarea varias veces, lo que creo que es más complicado de lo que debe ser.

¿Es esta la única manera de lograr lo que estoy tratando de hacer o me falta algo aquí?

Solución: Todas las respuestas apuntan en la misma dirección. Simplemente creé una relación One-To-Many creando una entidad "padre ficticio". Realmente no necesito un padre en mi caso y no tiene mucho sentido en el mundo real, por así decirlo. Pero después de configurar esta entidad ficticia como padre de cada una de las entidades secundarias, puedo guardarlas exactamente como lo hice antes sin preocuparme demasiado por las transacciones. Gracias a todos.

+0

Wow eso es extraño. Buena pregunta y respuesta –

+0

[Lea la respuesta a esta pregunta similar] (http://stackoverflow.com/questions/2323777/google-app-engine-cant-operate-on-multiple-entity-groups-in-a-single-transacti). Parece el mismo problema que estás teniendo. –

+0

Sí, esa era mi pregunta. Lo arreglé agregando una entidad padre y luego teniendo una relación uno a varios propiedad de modo que estaban en el mismo grupo de entidades. –

Respuesta

4

Quizás esto esté simplificado demasiado, pero podría simplemente agregar el número X de entidades como secundarios de una entidad principal y esto haría que estuvieran en el mismo grupo de entidades. Esto le permitiría persistir a todos en una transacción. Básicamente, cree una relación de uno a varios propiedad entre la entidad padre y los hijos, que son los objetos que intenta persistir.

+0

Interesante, entonces básicamente podría crear un padre "ficticio" para todas mis entidades y guardarlas exactamente como lo estoy intentando ahora? También intentaré eso, gracias. – pgruetter

+0

Sí, eso es correcto. Los niños con un padre común estarán en el mismo grupo de entidades. –

+0

No coloque muchas entidades en el mismo grupo de entidades si no necesita transacciones. Esto puede hacer que tu aplicación sea muy lenta. –

1

Este error indica que utiliza transacciones e intenta operar en múltiples grupos de entidades.

a partir de documentos:

Todas las operaciones del almacén de datos en una transacción deben operar en entidades del mismo grupo de entidades. Esto incluye consultar entidades por antecesor, recuperar entidades por clave, actualizar entidades y eliminar entidades. Tenga en cuenta que cada entidad raíz pertenece a un grupo de entidades separado, por lo que una sola transacción no puede crear u operar en más de una entidad raíz.

No puede simplemente crear más de una entidad raíz (sin matriz) en la transacción, pero puede hacerlo si cada una de ellas es hija de otra entidad. Si solo desea crear entidades, hágalo fuera de la transacción.

+0

Este es un buen punto. Depende de si @ socken23 realmente necesita que esto sea transaccional o no. De lo contrario, no usar una transacción como la que sugiere funcionaría bien. –

+0

Gracias, esto tiene sentido ahora. Trataré de guardarlos fuera de una transacción. Supongo que tengo algo que leer primero. Todavía no he leído mucho sobre el tema y tendré que hacer eso para ver dónde GAE usa las transacciones automáticamente. – pgruetter

Cuestiones relacionadas