1. java
  2. android
  3. c#
  4. .net
  5. javascript
  6. php
  7. jquery
  8. html
  9. sql

Inserir vários registros em uma mesma transação

Olá, estou tentando trabalhar com persistencia de dados. Estou lendo um arquivo texto e tentando inserir varios registros ao mesmo tempo na tabela. Quando termina o processo e consulto a tabela, fica gravado apenas o último registro.

Na minha classe para inserir os registros está assim:

package br.com.orei.jpa;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;

public class TesteTransacao {

    public static void main(String[] args) {

        EntityManagerFactory factory = Persistence.createEntityManagerFactory("loterias-pu");
        EntityManager em = factory.createEntityManager();

        em.getTransaction().begin();

        QuinaEntity teste = new QuinaEntity();

        for (int i = 5; i < 10; i++) {
            teste.setSequencial(i);
        }

        em.getTransaction().commit();
        em.close();

    }

}

A minha classe entity é essa:

package br.com.orei.jpa;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name = "Quina")
public class QuinaEntity {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private int sequencial;

        // Getters and Setters

}

E minha persistence.xml esta assim.

<?xml version ="1.0" encoding ="UTF-8"?>
<persistence version="2.0"
    xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/persistence
http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">

    <persistence-unit name="loterias-pu" transaction-type="RESOURCE_LOCAL">
        <provider>org.hibernate.ejb.HibernatePersistence</provider>
        <properties>
            <property name="hibernate.dialect" value="org.hibernate.dialect.SQLServerDialect" />
            <property name="hibernate.hbm2ddl.auto" value="update" />
            <property name="javax.persistence.jdbc.driver"
                value="com.microsoft.sqlserver.jdbc.SQLServerDriver" />
            <property name="javax.persistence.jdbc.user" value="sa" />
            <property name="javax.persistence.jdbc.password" value="senha" />
            <property name="javax.persistence.jdbc.url"
                value="jdbc:sqlserver://localhost:1433;DatabaseName=Loterias" />
            <property name="show_sql" value="true" />
            <property name="hibernate.temp.use_jdbc_metadata_defaults"
                value="false" />
        </properties>
    </persistence-unit>
</persistence>

O que está errado? Alguém pode me ajudar?

Att.

Cassio Danilo, grato. Realmente precisava instanciar a cada loop, e a aplicação travava também porque eu nao estava fechando EntityManagerFactory.close; Segue código final:

EntityManagerFactory factory = Persistence.createEntityManagerFactory("loterias-pu");
    EntityManager em = factory.createEntityManager();
    QuinaEntity teste;
    for (int i = 1; i < 100; i++) {
        teste = new QuinaEntity();
        em.getTransaction().begin();
        teste.setSequencial(i);
        em.persist(teste);
        em.getTransaction().commit();
        em.clear();
        System.out.println(i);
    }
    em.close();
    factory.close();

Resolvido.

  • Você precisa commitar a cada loop no for: em.getTransaction().commit(); esse trecho deve estar dentro do loop. Perceba que você commita somente depois do laço terminar, consequentemente somente o ultimo registro é inserido.

    Cassio Danilo   07 de nov de 2015
  • Cássio, Se eu coloco apenas o commit no for, retorna uma exceção ("java.lang.IllegalStateException: Transaction not active"). Então ao colocar o em.getTransaction().begin(); dentro do for, a aplicação deve ficar em loop pois não termina. Será que não preciso de algum outro método ou objeto antes de iniciar?

    Att.

    OlinthoJesus   07 de nov de 2015
  1. Você vai ver essas setas em qualquer página de pergunta. Com elas, você pode dizer se uma pergunta ou uma resposta foram relevantes ou não.
  2. Edite sua pergunta ou resposta caso queira alterar ou adicionar detalhes.
  3. Caso haja alguma dúvida sobre a pergunta, adicione um comentário. O espaço de respostas deve ser utilizado apenas para responder a pergunta.
  4. Se o autor da pergunta marcar uma resposta como solucionada, esta marca aparecerá.
  5. Clique aqui para mais detalhes sobre o funcionamento do GUJ!

1 resposta

Não é a resposta que estava procurando? Procure outras perguntas com as tags hibernate jpa ou faça a sua própria pergunta.