Hibernate atualizar apenas alguns campos da tabela

Olá pessoal !

Em uma situação particular da aplicação, eu preciso atualizar apenas alguns campos de uma tabela (inclusive, os demais não estão nem presentes por que não vieram do form postado).

Como faço essa escolha de campos a sofrerem o update ? O que está havendo é que o VO está vindo no controller com esses campos que não devem ser atualizados nulos (e isso está correto mesmo) e então o update os torna nulos na tabela.

Obrigado, desde já !

Uma opção fácil é buscar a entidade antes, setar só os dados que precisa e atualizar. Tentando exemplificar:

public void atualizarUsuario(UsuarioVO usuarioVO) {
  Usuario usuarioSalvo = usuarioDao.findById(usuarioVO.getId());
  usuarioSalvo.setNome(usuarioVO.getNome());
  usuarioSalvo.setIdade(usuarioVO.getIdade());
  usuarioDao.merge(usuarioSalvo);
}

Busquei o Usuario, atribui só nome e idade que veio do VO e salvei minha entidade.

1 curtida

Quando você usa Hibernate você tem dois tipos de objetos quando realiza o update, o persistente e o transiente. O objeto transiente é aquele que não faz parte de uma sessão do Hibernate, que no caso é o objeto que você está usando no update. Este tipo de objeto, como ainda não é gerenciado pelo Hibernate, ele acaba alterando todos os dados lá na tabela, menos o ID é claro.
Já um objeto persistente é aquele que o Hibernate já conhece, ele passou pela sessão do Hibernate e está idêntico aos valores armazenados na tabela. Assim, quando realizar o update, ele altera apenas os campos da tabela que estão com valores diferentes dos atributos do objeto. Para ter acesso a um objeto persistente, antes do update, faça uma consulta no banco e altere o abjeto retornado pela consulta com os valores que você quer alterar no banco de dados. Como o exemplo do colega @fredericomaia10.

1 curtida

Muito obrigado pelas duas respostas ! Ficou mais claro para mim agora que terei que buscar o registro no banco e deixar com os mesmos valores no objeto os atributos que não quero que sejam alterados. O que está acontecendo hoje é que os dados estão vindo de uma postagem de um formulário e há dois campos que não estão no formulário (e nem devem estar), fazendo com que o objeto seja instanciado com null para esses campos e ao salvar (update), esse null sobrescreve os valores pré existentes. Eu estava tentando sem sucesso, deixar esses dois campos de fora dessa atualização.

Valeu !!