Menu

No se me aplica correctamente el XPersistence.getManager().persist

2023-01-09
2023-01-16
  • Xavier Gonzalez

    Xavier Gonzalez - 2023-01-09

    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:

    Cliente cliente = null;
    for (ObjetoRecuperado object : lista) {
        cliente = new Cliente();
        cliente.setNombre(object.getField().getNombre();
        cliente.setTelefono(object.getField().getTelefono();
        cliente.setCIF(object.getField().getCIF();
        XPersistence.getManager().persist(cliente);
    }
    
    Registro registro = new Registro();
    registro.setFecha(new Date());
    registro.setNumClientes(numClientes);
    registro.setDescripcion(descripcion);
    XPersistence.getManager().persist(registro);
    XPersistence.commit();
    

    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

     
  • Javier Paniza

    Javier Paniza - 2023-01-11

    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
  • Xavier Gonzalez

    Xavier Gonzalez - 2023-01-12

    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.

     
  • Javier Paniza

    Javier Paniza - 2023-01-16

    Hola Xavier:

    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í:

    EntityManager manager = XPersistence.createManager();
    manager.getTransaction().begin();
    
    // AQUÍ TU CÓDIGO JPA
    
    manager.getTransaction().commit();      
    manager.close();
    

    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.

    me funciona diferente en los dos casos.

    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.

     
  • Xavier Gonzalez

    Xavier Gonzalez - 2023-01-16

    Gracias JP

     

Log in to post a comment.