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 ?
Seria melhor utilizar entityManager.flush() ao invés de ficar abrindo uma nova transação a cada 500 voltas.
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)
Vi o que me mandou, mais no caso, eu estou fazendo um insert direto, sem fazer find antes.
[quote=aszarael]Vi o que me mandou, mais no caso, eu estou fazendo um insert direto, sem fazer find antes.
[/quote]Cara, você quer apenas olhar código e achar uma resposta? Pq vc ñ entendeu o conceito? O.o
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.
Resolvi o problema da seguinte maneira
[code]
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;
}[/code]
Valeu a ajuda.