style="display:inline-block;width:728px;height:90px"
data-ad-client="ca-pub-5164839828746352"
data-ad-slot="7563230308">

JPA JTA persist en un for no registra en la base de datos

Cordial Saludo.

Comunidad de Java México, les pido el favor de ayudarme con el siguiente problema.

Estoy creando una funcionalidad sencilla que está fallando.

A partir de un Managed Bean paso a un método de un EJB un objeto. Este objeto será registrado mas de 1 vez, cambiándole el valor de su propiedad fecha y asignándole NULL a su ID con la intención que cada vez que se llama el método em.persist(objeto) cree un nuevo registro en la tabla de la base de datos.

el código original es similar al siguiente:::

@Stateless
public class Clase implements ClaseLocal {

    @PersistenceContext(unitName = "Aplicacion-ejbPU")
    private EntityManager em;
   

    @Override
    public void registroMasivo(Event objeto){
       
 
       
        try {

            Calendar calendario = Calendar.getInstance();
            for(int i = 0; i < 5; i++)
            {
               
               
                calendario.add(Calendar.MONTH, 1);
               
                objeto.setFecha(calendario.getTime());
               
               em.persist(objeto);

               em.detach(objeto);

                objeto.setId(null);
               
            }
           
           

        } catch (Exception ex) {
            ex.printStackTrace();

        }

    }

En el archivo persistence.xml está configurado lo siguiente:::

persistence-unit name="Aplicacion-ejbPU" transaction-type="JTA"

.

El comportamiento final que tiene el código es que no guarda 5 registros en la base de datos, sino que a lo mucho solo guarda 1 solo registro con la última fecha asignada en el for.

Lo que necesito es que guarde 5 registros diferentes, cada uno con fecha distinta.

He buscado por posibles soluciones que incluyen usar la anotación @Transactional por ejemplo pero nada funciona.

Creo que la idea de lo que quiero hacer es muy sencilla, pero no entiendo porqué no funciona bien.

La aplicación está configurada con JTA... leía otra solución que era manejar las transacciones en el mismo método anotando la clase con @TransactionManagement(TransactionManagementType.CONTAINER) y en el método llamar el método .comit()
PERO
no es una opción válida en mi caso, deseo seguir trabajando con JTA.

Les agradezco me ayuden a aclarar que es lo que sucede.

Muchas gracias.

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.

Proyecto ejecutable

A simple vista lo primero que veo es que tu ciclo for tiene 'mal' las llaves, para mi estan mal por que el estilo de código es siempre abrir y cerrar las llaves , en segunda no se por que usas "em.detach(objeto);" y "objeto.setId(null);", ahora envolver el metodo con la anotación "@Transactional" te ayudara a que la ejecución de multiples inserts se haga en una sola transacción en lugar de una transacción por cada insert, ahora con respecto al código que tienes y a la solución que necesitas lo unico que te puedo dar por la información que proporcionaste es crear nuevos objetos Event es decir, por cada objeto Event que quieras insertar hagas "Event event = new Event();", asignas los valores que quieras y les das "em.persist(event)", prueba con eso, un ejemplo para que quede mas claro:

Event event1 = new Event();
//asignar valores a las propiedades
em.persist(event1);

Event event2 = new Event();
//asignar valores a las propiedades
em.persist(event2);

 

Espero que la entidad tenga un id tipo identity o algo similar, si no te funciona, haz un proyecto sencillo y subelo a Github para poderlo correr.

Gracias

Muchas gracias jesusperales por contestar.

Lo que realmente hizo funcionar mi código (el código de arriba no era real, solo un ejemplo del problema que se me presentó en mi código fuente) fue esto de

"
ahora con respecto al código que tienes y a la solución que necesitas lo unico que te puedo dar por la información que proporcionaste es crear nuevos objetos Event es decir, por cada objeto Event que quieras insertar hagas "Event event = new Event();", asignas los valores que quieras y les das "em.persist(event)"
"

Me parece algo desafortunada tener que crear eventos Event de esta manera cuando la diferencia entre los que registro es solo una fecha y el ID. Sería muy bueno solo darle a entender a JPA que es una nueva entidad a registrar en la base con fecha diferente y que al registrar le asigne un ID en la base de datos diferente.

Asi esta hecho

Realmente JPA es bueno, pero no esta para darle gusto a todos y personalmente creo que es justo lo que quieres, "solo darle a entender a JPA que es una nueva entidad" ¿y como lo haces? pues con la palabra reservada new o bueno esta es la solución actualmente, pero puedes sugerir el como deberia hacerse, osea aportar una idea o algo mas concreto aunque sea pseudocodigo, esta así por que no se encontraron mas ideas, la especificación esta hecha para estandarizar y hacer mas sencillo el trabajo para nosotros los programadores pero puede cambiar y agregarse nuevas funcionalidades, prueba de ello es que se agrego soporte para la ejecución de Stored Procedures en JPA 2.1, eso si tarda en llegar.

style="display:inline-block;width:728px;height:90px"
data-ad-client="ca-pub-5164839828746352"
data-ad-slot="7563230308">