Update atualizando registros não desejados com hibernate

9 respostas
R

Bom dia pessoal,

Estou fazendo um update com o hibernate porem ele esta atualizando os registros que não foram alterados tmb, por exemplo, tenho estas colunas (nome, idade, cidade) com estes valores (renato, 22, são paulo) se por acaso eu alterar somente a idade para 23 por exemplo, ao invés de apenas a idade ser atualizada o que esta acontecendo é q a idade ira ser atualizada para 23 e o nome e a cidade irão ficar null pois não passei os valores de atualização deles, isso não deveria acontecer pois eu queria que apenas o valor da idade fosse alterado e as colunas restantes mantivessem os valores, alguem sabe como resolver isso?? segue meu codigo de update abaixo:

public void altera(T entity) {
	HibernateUtil.currentSession().update(entity);
}

9 Respostas

R

Você pode usar o dynamic update do hibernate. Mas mesmo nesse caso não irá funcionar.

Se você quer alterar uma entidade, busque-a no banco, altere o que quer e aí faça o update.

Se ainda quiser que a query só inclua as colunas que realmente foram alteradas, veja o seguinte post:

http://www.mkyong.com/hibernate/hibernate-dynamic-update-attribute-example/

Lembrando que isso é específico do Hibernate, não é do JPA.

R

Obrigado pela ajuda, mas só uma pergunta, isso é realmente normal?? pq o meu cenario real é o seguinte, tenho uma tabela com muitas colunas, porem no formulario de edição eu trago apenas algumas dessas colunas pois as outras nao tem necessidade de serem alteradas nem exibidas para o usuario, até ae beleza, o form exibe la os dados q são relevantes, o usuario altera o que for preciso e clica em gravar, pq o hibernate simplesmente não altera só o que estava sendo exibido ali no form, pq ele atualiza tmb o que nem foi mexido ou visto pelo usuario?

R

É o comportamento normal sim. O Hibernate vai usar o estado da entidade para definir o registro na tabela, ele fará um “espelho”, portanto ele vai persistir os valores que ele encontrar na entidade.

Por isso que seria melhor você buscar a entidade, alterar os dados que quer e depois fazer o update…

R

É como o rodrigo falou, isso nao é da JPA, é do Hibernate. Faça como ele disse, busque a entidade que voce quer alterar, do banco, depois set somente os atributos que voce quer alterar. Exemplo:

Entidade Pessoa, tem nome e telefone, quero alterar somente o telefone:

  1. Pessoa pessoa = pessoaDao.getPorNome(“Nome da Pessoa”)

Dai voce vai buscar o objeto pessoa que voce quer alterar, dai agora é so setar o que voce quer mudar.

pessoa.setTelefone(“1111-1111”);

Depois:

session.update(pessoa);

Abraços.

R

entendi galera, muito obrigado pela ajuda

R

Ou você pode usar Criteria.

Pode ser setado os valores que você deseja alterar, claro antes recuperando seu objeto pelo ID, e depois você usa criteria.createQuery(seuObj), é o método mais prático que eu achei por enquanto.

Dê uma pesquisada na API Criteria, ajudará bastante.

R

Rodrigo Sasaki:
É o comportamento normal sim. O Hibernate vai usar o estado da entidade para definir o registro na tabela, ele fará um “espelho”, portanto ele vai persistir os valores que ele encontrar na entidade.

Por isso que seria melhor você buscar a entidade, alterar os dados que quer e depois fazer o update…

Opa cara, fiz esse prodecimento do link que vc me passou, anotando minhas entitys com “@org.hibernate.annotations.Entity(dynamicUpdate = true)” porem se é uma entity nova e a tabela dela ainda nao foi criada no banco o hibernate nao esta mais crianda, antes ele criava as tabelas automaticamente de todas as minhas entitys, agora nao cria mais nenhuma quando esta anotadas com dynamic update, ja mudei no xml de updtae para create e nao resolveu, sabe o q pode ser?? sera que se eu rodar o sistema sem o dynamic só pra criar as tabelas e depois colocar o dynamic ele vai entender a diferença?

R

Rodrigo Sasaki:
É o comportamento normal sim. O Hibernate vai usar o estado da entidade para definir o registro na tabela, ele fará um “espelho”, portanto ele vai persistir os valores que ele encontrar na entidade.

Por isso que seria melhor você buscar a entidade, alterar os dados que quer e depois fazer o update…

Cara achei o problema, tinha nada a ver com isso ae, era erro de codigo meu mesmo, desculpa o incomodo.

R

rafadelnero:
Ou você pode usar Criteria.

Pode ser setado os valores que você deseja alterar, claro antes recuperando seu objeto pelo ID, e depois você usa criteria.createQuery(seuObj), é o método mais prático que eu achei por enquanto.

Dê uma pesquisada na API Criteria, ajudará bastante.

Cara vc tem alguma exemplo de codigo utilizando o criteria?

Criado 3 de dezembro de 2012
Ultima resposta 3 de dez. de 2012
Respostas 9
Participantes 4