JPA- Atulizando(Merge)

4 respostas
C

Pessoal tenho uma duvida, quanto uso o merge ele atualiza no bd a entidade inteira que no caso eu passei, porém se eu quiser atualizar apenas alguns campos, por exemplo a entidade tem:

Nome,
RG,
Cpf,

sendo que RG e CPF não podem ser nulos, e eu quero atualizar apenas o nome. Eu não queria ir buscar todos os campos trocar e ir persistir novamente, queria persistir apenas o nome. Como faço isso?

4 Respostas

raphaeloneves

Não tenho 100% de certeza do que vou afirmar, logo, cabe uma pesquisa a respeito. A JPA trabalha com a persistência de OBJETOS, logo vc não consegue passar um único atributo pra persistência. Quando a JPA identifica que o objeto dentro do contexto de persistência tem um ou mais atributos diferentes do registro atual, é feita a persistência (UPDATE) e em seguida o objeto atualizado é retornado em estado “managed”.

Cabe a pesquisa em ativar o debug do hibernate e alterar um ou mais atributos de um objeto persistido a fim de validar se o UPDATE é feito somente nos campos que a JPA identificou mudança ou sempre atuará em todo o objeto.

C

Entendi, então quer dizer se passar um OBJETO com valores null, com o unico atributo que eu queria mudar preenchido, ele vai alterar tudo?

raphaeloneves

Se vc passar um objeto válido que represente a entidade (incluindo o ID), sim, ele vai alterar tudo!

M

Eu me deparei com o mesmo problema, o solucionei da seguinte forma: usando reflection primeiramente eu recuperava o objeto que seria alterado(ou seja, o objeto completo do banco de dados), depois percorri todos os atributos do objeto recebido (com a informação que ia alterar algum atributo do objeto que esta no bd) e verificava se algum deles estava vindo como null, caso o valor fosse null eu substituia o null pelo respectivo atributo do objeto que eu peguei do bd no começo. Para deixar mais claro:

update( T object){

find (usando o id de object pega o respectivo objeto no bd)

faça um laço para percorrer todos os atributos de object, caso algum seja null, substitua pelo valor do objeto que vc adquiriu usando o find.

da o merge

}

Veja um pouco de reflection, vai te ajudar a resolver esse problema. Boa sorte

Criado 26 de julho de 2017
Ultima resposta 29 de jul. de 2017
Respostas 4
Participantes 3