[Resolvido] Salvar arrayList no banco!

Pessoal

Tenho esse arrayList aqui.

public List<Produto> lista = new ArrayList<Produto>();  
Produto eh essa classe aqui:

   public class Produto implements   Serializable{  
     
   private static final long serialVersionUID = -2477528265610024554L;  
   @Id    
    @GeneratedValue(strategy= GenerationType.AUTO)  
     
   private Long id;    
   public Item objetoItem;     
   public int quantidadeItem;  
//gets e set  
//Hashcode e equals  

Entao, coloquei o arrayList lista na sessao. To tentando salvar esse array na minha tabela item_x_requisicao (referente a minha classe ItemRequisicao)

...  
session.setAttribute("carrinhoSessao", carrinhoBean.lista);  
itemRequisicao.setItem((Item) session.getAttribute("carrinhoSessao"));   
  
itemRequisicao.setQuantidadeSolicitada((Integer) session.getAttribute("carrinhoSessao"));    
  
itemRequisicaoRN.salvar(itemRequisicao);    

tentei salvar direto e deu erro, ja imagina q fosse dar erro… O q devo fazer ?
Deu esse erro aqui:

java.lang.ClassCastException: java.util.ArrayList cannot be cast to requisicao.item.Item

javax.faces.el.EvaluationException: java.lang.ClassCastException: java.util.ArrayList cannot be cast to requisicao.item.Item
at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:98)
at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:98)
at javax.faces.component.UICommand.broadcast(UICommand.java:311)
at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:781)
at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1246)
at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:77)
at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:97)
at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:114)
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:310)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at requisicao.web.filter.ConexaoHibernateFilter.doFilter(ConexaoHibernateFilter.java:32)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:344)
at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:110)
at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:84)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:356)
at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:98)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:356)
at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:95)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:356)
at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:79)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:356)
at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:55)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:356)
at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:36)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:356)
at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:188)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:356)
at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:106)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:356)
at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:80)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:356)
at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:150)
at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:237)
at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:167)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:225)
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:98)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:927)
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:1001)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:585)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:312)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
at java.lang.Thread.run(Thread.java:662)
Caused by: java.lang.ClassCastException: java.util.ArrayList cannot be cast to requisicao.item.Item
at requisicao.web.RequisicaoBean.salvar(RequisicaoBean.java:217)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at com.sun.el.parser.AstValue.invoke(AstValue.java:234)
at com.sun.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:297)
at com.sun.faces.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:102)
at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:84)

1-“carrinhoSessao” é uma lista, e vc esta fazendo castitemRequisicao.setQuantidadeSolicitada((Integer) session.getAttribute("carrinhoSessao"));

2-Neste metodo itemRequisicaoRN.salvar(itemRequisicao);
Ele itera esta lista e salva de forma individual?

[quote=avsouza]1-"carrinhoSessao" é uma lista, e vc esta fazendo castitemRequisicao.setQuantidadeSolicitada((Integer) session.getAttribute(&quot;carrinhoSessao&quot;));

2-Neste metodo itemRequisicaoRN.salvar(itemRequisicao);
Ele itera esta lista e salva de forma individual?[/quote]

Em cada objeto dessa lista eu tenho um objeto Produto. Esse objeto produto tem o seguinte:

objetoItem -> tipo Item
quantidadeItem -> Tipo int

Eu preciso salvar isso na minha tabela item_x_Requisicao (Classe ItemRequisicao)

Ex:

ObjetoItem x quantidade 15
ObjetoItem y quantidade 2
ObjetoItem s quantidade 25

E assim sucessivamente… Entendeu ? P ser sincero eu nao entendi a sua pergunta : /
Se eu n fizer o cast o programa nao compila…

[quote=tiago__][quote=avsouza]1-"carrinhoSessao" é uma lista, e vc esta fazendo castitemRequisicao.setQuantidadeSolicitada((Integer) session.getAttribute(&quot;carrinhoSessao&quot;));

2-Neste metodo itemRequisicaoRN.salvar(itemRequisicao);
Ele itera esta lista e salva de forma individual?[/quote]

Em cada objeto dessa lista eu tenho um objeto Produto. Esse objeto produto tem o seguinte:

objetoItem -> tipo Item
quantidadeItem -> Tipo int

Primeiro eu salvo outros dados na tabela Requisicao e depois eu salvo na Tabela Item_x_Requisicao.
Na tabela Requisicao ta salvando normal, mas nessa tabela ta dando o erro do post anterior. Esse arrayList eu so uso p salvar na tabela item_x_requisicao.
Eu preciso salvar isso na minha tabela item_x_Requisicao (Classe ItemRequisicao)

Ex:

ObjetoItem x quantidade 15
ObjetoItem y quantidade 2
ObjetoItem s quantidade 25

E assim sucessivamente… Entendeu ? P ser sincero eu nao entendi a sua pergunta : /
Se eu n fizer o cast o programa nao compila… [/quote]

Neste ponto você esta pegando uma lista e tentando setar em um Item que pelo jeito é uma classe…por isso o cast esta dando erro…voce precisa dar um for na lista…pegando cada item dela e setando na sua entidade…entendeu?

itemRequisicao.setItem((Item) session.getAttribute("carrinhoSessao")); 

[]'s

//coloca uma lista na sessao
session.setAttribute("carrinhoSessao", carrinhoBean.lista);  

//este set esta preparado para receber uma lista?
itemRequisicao.setItem((Item) session.getAttribute("carrinhoSessao"));   
  
//aqui vc faz cast de lista para integer, ele compila, mas na execução dará erro
itemRequisicao.setQuantidadeSolicitada((Integer) session.getAttribute("carrinhoSessao"));    
  
//aqui perguntei se este salvar itera a lista
itemRequisicaoRN.salvar(itemRequisicao);    

Se entendi ao certo acho que isso resolveria.


List produtos = (ArrayList) session.getAttribute("carrinhoSessao");

for(Produto produto : produtos){
  itemRequisicao.setItem((Item) produto.getItem());
  itemRequisicao.setQuantidadeSolicitada((Integer) produto.getQuantidadeItem());
  itemRequisicaoRN.salvar(itemRequisicao);
}

Senão entendeu o código posta ai que explico.

[]'s

Pelo que eu entendi do seu código você esta pegando uma lista da sessão e tentando setar dentro do Produto no atributo Item depois pegando a mesma lista e tentando setar no atributo quantidadeItem…não rola fazer isso…

Pra setar o Item dentro do Produto você precisa percorrer a lista pegando produto por produto pra depois manipular os dados…

[]'s

.

[quote=tiago__][quote=bastides]Se entendi ao certo acho que isso resolveria.


List produtos = (ArrayList) session.getAttribute("carrinhoSessao");

for(Produto produto : produtos){
  itemRequisicao.setItem((Item) produto.getItem());
  itemRequisicao.setQuantidadeSolicitada((Integer) produto.getQuantidadeItem());
  itemRequisicaoRN.salvar(itemRequisicao);
}

Senão entendeu o código posta ai que explico.

[]'s[/quote]
[size=18]
Entendi seu codigo sim :smiley: ! Utilizei seu codigo e agora ele ta inserindo, o problema eh q ele so ta inserindo o ultimo objeto… Fiz varios testes aqui. Nao ta dando erro,
Mas ele so ta inserindo o ultimo objeto do arrayList. O codigo ficou quase = ao seu.[/size]

[code]

	List <Produto> produtos = (ArrayList) session.getAttribute("carrinhoSessao");
	
	for(Produto produto : produtos){  
		  itemRequisicao.setItem((Item) produto.getObjetoItem());  
		  itemRequisicao.setQuantidadeSolicitada((Integer) produto.getQuantidadeItem()); 
	
	itemRequisicaoRN.salvar(itemRequisicao);  
	}

[/code][/quote]

Se ele estiver salvando apenas o ultimo, ou é pq o salvar esta fora do for…ou esse método salvar apenas armazena e em um próximo momento ele salva…pois se este código itemRequisicaoRN.salvar(itemRequisicao); esta dentro do for e é responsavel pelo insert no banco, era pra a cada loop ele gravar no banco um itemRequisicao…posta o código desse método salvar…

[]'s

[quote=bastides]Se ele estiver salvando apenas o ultimo, ou é pq o salvar esta fora do for…ou esse método salvar apenas armazena e em um próximo momento ele salva…pois se este código itemRequisicaoRN.salvar(itemRequisicao); esta dentro do for e é responsavel pelo insert no banco, era pra a cada loop ele gravar no banco um itemRequisicao…posta o código desse método salvar…

[]'s
[/quote]

Pensei a mesma coisa em relacao ao loop do for !
Vou colocar aqui meu metodo salvar.

	List <Produto> produtos = (ArrayList) session.getAttribute("carrinhoSessao");
		System.out.println("Array banco" +  produtos);
		
		for(Produto produto : produtos){  
			  itemRequisicao.setItem((Item) produto.getObjetoItem());  
			  itemRequisicao.setQuantidadeSolicitada((Integer) produto.getQuantidadeItem()); 
			  itemRequisicaoRN.salvar(itemRequisicao); 
		
		}
   
	    return "this.destinoSalvar";  
	}

ItemRequisicaoDAO

public void salvar(ItemRequisicao itemRequisicao);

ItemRequisicaoDAOHibernate


	public void salvar(ItemRequisicao itemRequisicao) {
		this.session.save(itemRequisicao);
	}

ItemRequisicaoRN

	public void salvar(ItemRequisicao itemRequisicao) {
		this.itemRequisicaoDAO.salvar(itemRequisicao);
	}

Cara acho que é o seguinte, como você não esta dando new no itemRequisicao, voce salva no banco…ele grava os novos dados por cima desse objeto e salva de novo no banco…o hibernate deve estar fazendo insert no primeiro loop do for…depois esta só atualizando…dando update no mesmo registro…por isso no final só fica o ultimo registro…

Antes de fazer qualquer alteração sobe seu servidor em debug, vai apertando f6 pra passar linha a linha…e repara senão é isso que hibernate esta fazendo…insert no primero registro depois update nos outros…pq se for isso mesmo a alteração do new resolve…

for(Produto produto : produtos){    
          [b]itemRequisicao = new ItemRequisicao();[/b]
          itemRequisicao.setItem((Item) produto.getObjetoItem());    
          itemRequisicao.setQuantidadeSolicitada((Integer) produto.getQuantidadeItem());   
          itemRequisicaoRN.salvar(itemRequisicao);   
      
    } 

Não esquece de postar a resolução para ajudar quem possa ter a mesma duvida futuramente.

[]'s

[quote=bastides]Cara acho que é o seguinte, como você não esta dando new no itemRequisicao, voce salva no banco…ele grava os novos dados por cima desse objeto e salva de novo no banco…o hibernate deve estar fazendo insert no primeiro loop do for…depois esta só atualizando…dando update no mesmo registro…por isso no final só fica o ultimo registro…

Antes de fazer qualquer alteração sobe seu servidor em debug, vai apertando f6 pra passar linha a linha…e repara senão é isso que hibernate esta fazendo…insert no primero registro depois update nos outros…pq se for isso mesmo a alteração do new resolve…

[code]
for(Produto produto : produtos){
itemRequisicao = new ItemRequisicao();
itemRequisicao.setItem((Item) produto.getObjetoItem());
itemRequisicao.setQuantidadeSolicitada((Integer) produto.getQuantidadeItem());
itemRequisicaoRN.salvar(itemRequisicao);

} 

[/code][/quote]

Sempre posto a solucao :smiley: … Amanha no trabalho eu vou ver o q faco.

Ah, um colega meu flw o seguinte “do jeito q ta só salva um item. Dentro do laço, eu devo criar itemRequisição em cada iteração e salvar no banco”

Entendi q eu tenho q criar um laco dentro desse laco p ele itemRequisicaoRN.salvar(itemRequisicao); de acordo com a quantidade de objetos q tem no arrayList.

Foi mais ou menos isso q entendi… N sei se entendi da forma correta, rs.

[quote=bastides]Cara acho que é o seguinte, como você não esta dando new no itemRequisicao, voce salva no banco…ele grava os novos dados por cima desse objeto e salva de novo no banco…o hibernate deve estar fazendo insert no primeiro loop do for…depois esta só atualizando…dando update no mesmo registro…por isso no final só fica o ultimo registro…

Antes de fazer qualquer alteração sobe seu servidor em debug, vai apertando f6 pra passar linha a linha…e repara senão é isso que hibernate esta fazendo…insert no primero registro depois update nos outros…pq se for isso mesmo a alteração do new resolve…

[code]
for(Produto produto : produtos){
itemRequisicao = new ItemRequisicao();
itemRequisicao.setItem((Item) produto.getObjetoItem());
itemRequisicao.setQuantidadeSolicitada((Integer) produto.getQuantidadeItem());
itemRequisicaoRN.salvar(itemRequisicao);

} 

[/code][/quote]

Resolvido…

Tava falatando eu colocar o objeto Requisicao no loop… Em relacao ao new itemRequisicao, vc estava certo :slight_smile:

	List <Produto> produtos = (ArrayList) session.getAttribute("carrinhoSessao");
		System.out.println("Array banco" +  produtos);
		
		for(Produto produto : produtos){  
			
			 ItemRequisicao itemRequ = new ItemRequisicao();
			 
			 itemRequ.setRequisicao((Requisicao)session.getAttribute("ObjetoRequisicaoSessao")); 
			 itemRequ.setItem((Item) produto.getObjetoItem());  
			 itemRequ.setQuantidadeSolicitada((Integer) produto.getQuantidadeItem()); 
			 itemRequisicaoRN.salvar(itemRequ); 	
			 
				
		}
		
	    return "this.destinoSalvar";  
	}

Muito obrigado pela ajuda ! Abracao

Sim sim…foi o que eu quis dizer…tem que dar um new…senão ele pega o mesmo objeto…insere no banco…depois como não da um new nele…ele continua usando o mesmo objeto…então quando vai no banco ele apenas da um update…quase certeza que é isso…faz o que eu falei…debuga…ve no console as querys…o hibernate printa no console…

[]'s

Opaa…demorou…qualquer coisa estamos ai…

[]'s