En el código anterior, que es una representación de lo que me pasa, los objetos creados de cliente que estan en un bucle, se crean correctamente en la bd con un insert.
En cambio el objecto registro, no se crea en la bd si no le aplico un XPersistence.commit(); a posterior.
No se deberían crear todos sin el commit.
Si no pongo la parte del código de objeto registro, los clientes se crean correctamente.
Me tiene muy despistado e igual hay una explicación lógica.
Gracias
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
Igual es esto.
No, no está en una acción de OpenXava.
Está dentro de un run() de una clase que implementa Runnable.
La clase anterior se llama una instancia desde una classe que implementa ServletContextListener para hacer un cron.
De todas formas, aunque no esté en una action de Openxava, me funciona diferente en los dos casos.
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
No, no está en una acción de OpenXava.
Está dentro de un run() de una clase que implementa Runnable.
En ese caso te tienes que encargar tú de hacer el commit(), dado que no se ejecuta dentro del ciclo de ejecución de la acción OpenXava, el cual crea un manager que después cierra. Además, aunque te hubiera funcionado esto te hubiera saturado el pool de conexiones bloqueando la aplicación con el tiempo, al ir atrapando conexiones sin liberarlas.
En el caso de un hilo, tienes que crear tu manager con XPersistence.createManager() y después cerrarlo. También has de crear la transacción y hacerle el commit, con tu código. Así:
Hola,
Tengo un problema al aplicar XPersistence.getManager().persist(object);
Me ocurre lo siguiente y no acabo de entender por qué. Quizás no lo estoy aplicando correctamente... a ver si alguien me puede indicar la razón.
Indico un ejemplo:
En el código anterior, que es una representación de lo que me pasa, los objetos creados de cliente que estan en un bucle, se crean correctamente en la bd con un insert.
En cambio el objecto registro, no se crea en la bd si no le aplico un XPersistence.commit(); a posterior.
No se deberían crear todos sin el commit.
Si no pongo la parte del código de objeto registro, los clientes se crean correctamente.
Me tiene muy despistado e igual hay una explicación lógica.
Gracias
Hola Xavier:
¿Dónde está ese código? ¿En el execute() de una acción de OpenXava? Si no, ¿dónde?
Ayuda a otros en este foro como yo te ayudo a ti.
Last edit: Javier Paniza 2023-01-11
Hola JP,
Igual es esto.
No, no está en una acción de OpenXava.
Está dentro de un run() de una clase que implementa Runnable.
La clase anterior se llama una instancia desde una classe que implementa ServletContextListener para hacer un cron.
De todas formas, aunque no esté en una action de Openxava, me funciona diferente en los dos casos.
Hola Xavier:
En ese caso te tienes que encargar tú de hacer el commit(), dado que no se ejecuta dentro del ciclo de ejecución de la acción OpenXava, el cual crea un manager que después cierra. Además, aunque te hubiera funcionado esto te hubiera saturado el pool de conexiones bloqueando la aplicación con el tiempo, al ir atrapando conexiones sin liberarlas.
En el caso de un hilo, tienes que crear tu manager con XPersistence.createManager() y después cerrarlo. También has de crear la transacción y hacerle el commit, con tu código. Así:
Incluso debería poner las línea finales en un finally, para que si hay alguna excepción no se quede la conexión sin cerrar.
A veces JPA puede hacer un flush() si lo necesita por su cuenta, quizás por eso te crea algunos datos.
Ayuda a otros en este foro como yo te ayudo a ti.
Gracias JP