JPA Problemas com Merge (Resolvido)

8 respostas
J

Estou desenvolvendo um aplicação usando SpringRoo e JSF 2.0 e estou tento o seguinte problema ao tentar atualizar um cliente no banco de dados

quando executa o metodo merge do JPA para inserir no banco funciona normal, mas quando carrego um objeto que possui ID e executo o metodo merge ele não faz o update, ele tenta fazer outro insert.

verifiquei q isso acontece se meu Controller estiver com escopo request, se mudar para session funcionar normal, mas nessa aplicação preciso trabalhar com escopo request.

abraços

8 Respostas

A

cara,

entao vc vai ter que fazer o seguinte, antes de fazer o merge, vc vai ter que fazer uma consulta no banco com o id desse objeto e substituir os atributos desses objeto pelo objeto que veio da sua requisição.

t+

J

Blz alissonvla valeu por responder…

Então sempre quando estiver usando escopo request com JPA, terei que buscar o objeto novamente no banco como o exemplo abaixo:

link para alterar na pagina xhtml:

<p:dataTable var="usuario" value="#{clienteController.listaClientes}" 	rendered="#{not empty clienteController.listaClientes}">
<p:column headerText="Operação">
 <h:commandLink value="Alterar">
   <f:ajax execute="@this" render=":edicao"/>
   <f:setPropertyActionListener target="#{clienteController.cliente}" value="#{cliente}"></f:setPropertyActionListener>
 </h:commandLink>
</p:column>

metodo salvar

public void salvar() {

Cliente clienteAux = Cliente.find(this.cliente.id)
clienteAux.setNome(this.cliente.nome)
this.cliente = clienteAux.merge();

}
A

cara,

vc pode usar o BeanUtils ele tem um metodo que copyProperties, que faz todo o servico de copiar as propriedades de um objeto para outro.
vai ficar assim

public void salvar() {  
  
Cliente clienteAux = Cliente.find(this.cliente.id)  ;
BeanUtils.copyProperties(clienteAux, cliente);
this.cliente = entityManager.merge(clienteAux);  
  
}
J

valeu a ajuda, vou tentar aqui, e falo se deu certo
at++

J

tentei fazer como vc falou e esta dando erro no BeanUtils

java.lang.IllegalArgumentException: Target must not be null

at org.springframework.util.Assert.notNull(Assert.java:112)

at org.springframework.beans.BeanUtils.copyProperties(BeanUtils.java:568)

at org.springframework.beans.BeanUtils.copyProperties(BeanUtils.java:509)

at br.com.integral.controller.UsuarioController.salvar(UsuarioController.java:55)
Usuario usuarioAux = Usuario.findUsuario(this.usuario.getId());
 BeanUtils.copyProperties(usuarioAux,this.usuario);
 this.usuario = usuarioAux.merge();
J

alissonvla deu certo valeu pela ajuda

deixa eu te perguntar uma coisa, como eu ja busquei esse objeto do banco, quando eh executado o comando merge o jpa não teria que ver que este objeto possui id e fazer o update e não o insert

sei que isso soh acontece com o scope request, mas parece que fazendo essa copia antes de gravar e meio gambiara…

t+

A

cara,

ele teria que fazer update no seu objeto.
Com certeza isso é uma gambi danada…rsrs

J

valeu a ajuda…

att

Criado 20 de outubro de 2011
Ultima resposta 21 de out. de 2011
Respostas 8
Participantes 2