[Resolvido]Modificação do objeto atualiza banco de dados automaticamente

8 respostas
R

E ai pessoal blz, Estou fazendo uma aplicação que eu tenho uma <p:dataTable id=“ItensDisponiveis” …> com vários itens listados com um <p:commandLink value=“Add” …> que adiciona o item selecionado para outra lista que seria a de pedido. tudo funciona bem, o que acontece é que quando eu pego o objeto da primeira table e uso um item.setQuantidade(1); para salvar apenas a quantidade x deste produto na segunda <p:dataTable id=“pedido” …>, ele automaticamente muda o valor da minha coluna no banco de dados . ou seja por exemplo eu tenho 50 unidades de mouse microsoft na primeira lista, ai quando vou adicionar mando o objeto selecionado por parâmetro e dentro do método eu mudo o valor que era 50 para 1 por exemplo para a quantidade deste item no pedido. Entretanto quando eu faço isso a quantidade do meu item na tabela item vai a 1 também(e que deveria manter em 50), desculpe se já existir algum tópico sobre isso mas é que nem sei bem como explicar ou procurar o que está acontecendo. Estou usando Hibernate + JSF2 + PrimeFaces.

obs: não estou fazendo nenhuma operação no banco neste instante, estou teoricamente apenas manipulando dados no bean entre tables.

Obrigado

8 Respostas

drsmachado

Discordo, você está realizando alteração no banco. Deve existir um update lá perdido.

R

Só se for automático com o hibernate pois manualmente eu não tenho eu cheguei até a comentar o conteúdo do saveOrUpdate da classe Item.
e o método só faz isso:

if(!listaItem.contains(item)){
   item.setQuantidade(1);
   listaItem.add(item);
}

Ele faz tudo certo fora que atualiza a tabela. e não sei o porquê.

drsmachado

Sinceramente, ainda acredito que existe alguma chamada que faz a atualização (e até diria que é na linha 233, mas como não temos o código…).

R

PedidoBean

@ViewScoped
@ManagedBean(name="pedidoBean")
public class PedidoBean implements Serializable{
	/**
	 * 
	 */
	private static final long serialVersionUID = 3366510622223475042L;
	//Object needed
	Pedido pedido = new Pedido();
	Item item = new Item();
	List<Item> listaItem = new ArrayList<Item>();  

	//--------------------------------------------CRUD Pedido's class - BEGIN------------------------------------------------------------------
	public void cadastrar(){
		
	}
	
	public void consultar(){
		
	} 
	
	public void alterar(){
		
	}
	
	public void excluir(){
		
	} 
	//--------------------------------------------CRUD Pedido's class - END------------------------------------------------------------------
	public void adicionarItemToPedido(Item item){System.out.println(item.getNome());

		if(!listaItem.contains(item)){item.setQuantidade(1);
			listaItem.add(item);
			}
		else{ 
			System.out.println(listaItem.indexOf(item)+ "   " + item.getQuantidade());
			listaItem.set(listaItem.indexOf(item), item);
			
			FacesMessage msg = new FacesMessage("Item adicionado",  Integer.toString(item.getQuantidade()));  
			
		    FacesContext.getCurrentInstance().addMessage(null, msg);
		}
			
	}
	public void removerItemToPedido(){System.out.println(item.getNome());
		listaItem.remove(item);
	}
	
	public void fecharPedido(){
		
	}
	
	public void onEdit(RowEditEvent event) {  
	    FacesMessage msg = new FacesMessage("Item Atualizado", ((Item) event.getObject()).getNome());  
	
	    FacesContext.getCurrentInstance().addMessage(null, msg);  
	}  
	  
	public void onCancel(RowEditEvent event) {  
	    FacesMessage msg = new FacesMessage("Altualizacao Cancelada", ((Item) event.getObject()).getNome());  
	
	    FacesContext.getCurrentInstance().addMessage(null, msg);  
	}
	//--------------------------------------------Methods Getters and Setters - BEGIN---------------------------------------------------------
	public Pedido getPedido() {
		return pedido;
	}

	public void setPedido(Pedido pedido) {
		this.pedido = pedido;
	}
	
	public List<Item> getListaItem() {
		return listaItem;
	}

	public void setListaItem(List<Item> listaItem) {
		this.listaItem = listaItem;
	}
	
	public Item getItem() {
		return item;
	}

	public void setItem(Item item) {
		this.item = item;
	}

	public static long getSerialversionuid() {
		return serialVersionUID;
	}
		//--------------------------------------------Methods Getters and Setters - END-----------------------------------------------------------
			
} //End of class

Pedido.JSF

<h:form id="formPagina"> <p:growl id="messages" showDetail="true"/>
				
				<p:panelGrid id="pgPedido" columns="2"> <f:facet name="header">Novo Pedido</f:facet>
					<p:outputLabel for="codigoPedido" value="Pedido:" />
					<p:inputText id="codigoPedido"  />
					<p:outputLabel for="dataPedido" value="Data:" />
					<p:inputMask id="dataPedido" mask="99/99/9999" value="#{pedidoBean.pedido.dataPedido}" />
					<p:outputLabel for="descontoPedido" value="Desconto(%):" />
					<p:inputText id="descontoPedido" />
				</p:panelGrid>
				
				<br/><br/>
				
				<p:dataTable id="dtItem" var="itemSelecionado" value="#{itemBean.itemListagem}" paginator="true" > <f:facet name="header">Itens Disponiveis</f:facet>
					<p:column headerText="Código">
						<h:outputLabel value="#{itemSelecionado.codigoItem}" />
					</p:column>
					<p:column headerText="Nome">
						<h:outputLabel value="#{itemSelecionado.nome}" />
					</p:column>
					<p:column headerText="Quantidade">
						<h:outputLabel value="#{itemSelecionado.quantidade}" />
					</p:column>
					<p:column>
						<p:commandLink value="ADD" action="#{pedidoBean.adicionarItemToPedido(itemSelecionado)}" update=":formPagina:dtItensSelecionados :formPagina:messages" >
						</p:commandLink>
					</p:column>
				</p:dataTable>
				
				<br/><br/>
			
				<p:dataTable id="dtItensSelecionados" value="#{pedidoBean.listaItem}" var="item" editable="true"> 
					
					<f:facet name="header">Itens Selecionados</f:facet>
					
					<p:ajax event="rowEdit" listener="#{pedidoBean.onEdit}" update=":formPagina:messages" />  
        			<p:ajax event="rowEditCancel" listener="#{pedidoBean.onCancel}" update=":formPagina:messages" />
        
					<p:column id="dtisCodigo" headerText="Código">  
	                    <h:outputLabel value="#{item.codigoItem}" /> 
					</p:column>
					<p:column id="dtisNome" headerText="Nome">
						
						<h:outputLabel value="#{item.nome}" />
					</p:column>
					<p:column id="dtisQuantidade" headerText="Quantidade">
					<p:cellEditor>
							<f:facet name="output">  
			                    <h:outputLabel value="#{item.quantidade}" /> 
			                </f:facet>  
			                <f:facet name="input">  
			                    <p:inputText value="#{item.quantidade}" style="width:100%"/>  
			                </f:facet>
						</p:cellEditor>
					</p:column>
					<p:column id="dtisRemover">
						<p:commandLink action="#{pedidoBean.removerItemToPedido()}">
							<h:graphicImage library="images" name="delete.png" />
						</p:commandLink>
					</p:column>
					<p:column id="rowEditorCommand">
						<p:rowEditor />
					</p:column>
				</p:dataTable>
				<br />
				<p:commandButton id="fecharPedido" action="#{pedidoBean.fecharPedido()}" ></p:commandButton>
	
			</h:form>

Não está muito organizado pois ainda estou só testando mesmo, coloquei apenas o , o ponto são as 2 <p:dataTable>, o resto não é importante e nem fiz ainda.
Obrigado pela ajuda.

P

Passe para false o atributo “autocommit”

R

valew pela dica, eu setei esta configuração no arquivo do hibernate, mas ainda continua alterando o valor.

R

Descobri que o que acontece é que o Hibernate sincroniza os objetos persistentes e se você o alterar ele automaticamente atualiza no banco de dados. Agora preciso descobrir como fazer um objeto virar transient.

R

Rakde:
Descobri que o que acontece é que o Hibernate sincroniza os objetos persistentes e se você o alterar ele automaticamente atualiza no banco de dados. Agora preciso descobrir como fazer um objeto virar transient.

Criei um objeto auxiliar passando apenas os atributos desejados assim o novo objeto permaneceu transient e o hibernate não dava update no valor que eu queria manter!.
Obrigado pessoal.

Criado 5 de julho de 2013
Ultima resposta 7 de jul. de 2013
Respostas 8
Participantes 3