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?
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.
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