Hibernate + JPA Fazer Multiplos insert

7 respostas
aszarael

Boa Tarde Pessoal,

Como poderia fazer um insert multiplo no meu banco,

Por exemplo, quero que faça o comit a cada 500 registros.

Fiz da seguinte Maneira

private Tmp_Ntc gravar(List<Tmp_Ntc> listaTmp){
		
		EntityManager entityManager = getEntityManager();
		
		Tmp_Ntc tmp = new Tmp_Ntc();
		
		entityManager.getTransaction().begin();
		
		int vConta = 0;
		for (int i = 0; i < listaTmp.size(); i++){
			
			tmp = listaTmp.get(i);
			
			if (tmp.getLOGIN() != null){
				//tmp = entityManager.merge(tmp);
			}else{
				entityManager.persist(tmp);
			}
			
			if (vConta == 500){
				entityManager.getTransaction().commit();
				entityManager.getTransaction().begin();
				vConta = 0;
				System.out.println("Atingiu 500");
			}else{
				vConta++;
			}
		}
		
		entityManager.getTransaction().commit();
		return tmp;
	}

Porem quando rodei, o mesmo não dez insert.
Alguem sabe porque ?

7 Respostas

Hebert_Coelho

Seria melhor utilizar entityManager.flush() ao invés de ficar abrindo uma nova transação a cada 500 voltas.

aszarael

Esta dando este erro

Mai 05, 2014 6:06:01 PM org.apache.catalina.core.StandardWrapperValve invoke Grave: Servlet.service() for servlet [jsp] in context with path [/operacoes_comis] threw exception [javax.persistence.PersistenceException: org.hibernate.PersistentObjectException: detached entity passed to persist: com.br.model.Tmp_Ntc] with root cause org.hibernate.PersistentObjectException: detached entity passed to persist: com.br.model.Tmp_Ntc at org.hibernate.event.def.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:79) at org.hibernate.event.def.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:38) at org.hibernate.impl.SessionImpl.firePersist(SessionImpl.java:618) at org.hibernate.impl.SessionImpl.persist(SessionImpl.java:592) at org.hibernate.impl.SessionImpl.persist(SessionImpl.java:596) at org.hibernate.ejb.AbstractEntityManagerImpl.persist(AbstractEntityManagerImpl.java:220) at com.br.dao.Tmp_ntcDao.gravar(Tmp_ntcDao.java:70) at com.br.dao.Tmp_ntcDao.add(Tmp_ntcDao.java:173) at com.br.util.funcoesFormataConteudoTextArea.formataTextArea(funcoesFormataConteudoTextArea.java:58) at com.br.util.funcoesFormataConteudoTextArea.formatTextArea(funcoesFormataConteudoTextArea.java:62) at org.apache.jsp.con02_jsp._jspService(con02_jsp.java:141) at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70) at javax.servlet.http.HttpServlet.service(HttpServlet.java:722) at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:432) at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:390) at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:334) at javax.servlet.http.HttpServlet.service(HttpServlet.java:722) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99) at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:929) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407) at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1002) at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:585) at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310) at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) at java.lang.Thread.run(Unknown Source)

Hebert_Coelho

Aqui explica o problema: http://uaihebert.com/jpa-mini-livro-primeiros-passos-e-conceitos-detalhados/23/

aszarael

Vi o que me mandou, mais no caso, eu estou fazendo um insert direto, sem fazer find antes.

Hebert_Coelho

aszarael:
Vi o que me mandou, mais no caso, eu estou fazendo um insert direto, sem fazer find antes.
Cara, você quer apenas olhar código e achar uma resposta? Pq vc ñ entendeu o conceito? O.o

aszarael

Cara, eu entendi o conceito, porem não que entendi e não procurando a resposta no codigo.
Diferente do que me passou, não estou utilizando uma entidade encadeada com outra.
Estou apenas tentando fazer um insert de 29000, registros em uma tabela, de maneira que consiga comitar a cada 500 registros.

aszarael

Resolvi o problema da seguinte maneira

private Tmp_Ntc gravar(List<Tmp_Ntc> listaTmp){
		Tmp_Ntc tmp = new Tmp_Ntc();
		List<Tmp_Ntc> listNtc = new ArrayList<Tmp_Ntc>();
		
		listNtc = listaTmp;
		
		EntityManager entityManager = getEntityManager();
		
		
		
		entityManager.getTransaction().begin();
		
		int vConta = 0;
		for (int i = 0; i < listNtc.size(); i++){
			
			tmp = listNtc.get(i);
			//System.out.println(tmp.getNUM_NTC());
			
			if (tmp.getLOGIN() != null){
				tmp = entityManager.merge(tmp);
			}else{
				entityManager.persist(tmp);
			}
			
			if (vConta == 500){
				entityManager.getTransaction().commit();
				entityManager.clear();          
				entityManager.getTransaction().begin();
				vConta = 0;
				System.out.println("Atingiu 500");
			}else{
				vConta++;
			}
		}
		
		entityManager.getTransaction().commit();
		return tmp;
	}

Valeu a ajuda.

Criado 5 de maio de 2014
Ultima resposta 6 de mai. de 2014
Respostas 7
Participantes 2