Update atualizando registros não desejados com hibernate
9 respostas
R
renatomattos2912
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);
}
Lembrando que isso é específico do Hibernate, não é do JPA.
R
renatomattos2912
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
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…
R
rof20004
É 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:
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
renatomattos2912
entendi galera, muito obrigado pela ajuda
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.
R
renatomattos2912
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
renatomattos2912
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
renatomattos2912
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?