Update Hibernate somente em campos necessarios

6 respostas
R

Bom dia,

Queria saber se é possivel personalizar o update do hibernate para que ele atualize apenas os dados alterados ou no minimo os dados que tenho no formulario, pq o meu cenario é o seguinte, tenho uma tabela com varias colunas, e tenho um formulario jsp que insere dados nesta tabela, só que este formulario não tem todos os campos que a tabela tem pois não ha necessidade, somente alguns dados são necessarios de serem inseridos ou alterados pelo formulario (exemplo: tabela tem campos “nome, idade, rg”, formulario tem campos “nome” pois não é necessario editar ou cadastrar idade e rg) porem o hibernate sempre faz o update em todos os campos da tabela, independetemente de eu ter alterado um ou todos, por enquanto eu resolvi o problema criando inputs hidden no meu form que guardam o valor dos campos do banco que não são necessarios no form para q quando eu fizer o update estes dados sejam atualizados com o mesmo valor anterior deles e nao como null que é o q aconteceria se eu nao fizesse essa gambiarra.

Tentei outras soluções como “@org.hibernate.annotations.Entity(dynamicUpdate = true)” sem sucesso
e tmb tentei criar um sql na mão para o update utilizando a anotação @SQLUpdate(“update…”) porem essa anotação só funciona se eu fizer update com todos os campos da tabela, se eu eliminar um campo que seja o hibernate da erro de index da tabela, ou seja, da na mesma.

se alguem puder me ajudar agradeço

6 Respostas

R

Renato, bom dia, seu problema não é grave, fica tranquilo.

O que fazer nesse caso ?

Primeiro entender 2 conceitos: O que é objeto Transiente e o que é objeto Persistente.

Quando voce salva um registro, pela primeira vez, antes do insert, ele é um objeto Transiente, ou seja, um objeto que ainda nao foi persistido, em grosso modo, um objeto que nao teve sequer contato com alguma session. Após voce salvar esse objeto ele passa a ser objeto Persistente, ou seja, um objeto que ja foi persistido.

No seu caso é bem simples, quando voce for alterar o registro, voce nao precisar dar o ‘new’, o que voce tem que fazer é buscar aquele objeto persistente que voce quer atualizar, aquele objeto que voce quer alterar somente alguns campos, exemplo:

Vou salvar o objeto Pessoa, que tem nome e rg.

Pessoa pessoa = new Pessoa();

pessoa.setNome(request.getAttribute(‘nome’));

pessoa.setRG(request.getAttribute(‘rg’));

dao.save(pessoa);

Ta vendo aquele new ? isso pro hibernate, por exemplo, defini o objeto ‘pessoa’ como um novo objeto, um objeto transiente.

Agora vou atualizar o mesmo:

Pessoa pessoa = dao.getPessoaPorNome(request.getAttribute(‘nome’));

Perceba que instanciei o objeto pessoa de forma diferente, eu peguei do banco o objeto que possui aquele nome, logo, o objeto pessoa nao sera mais transiente, e sim persistente, e é isso que faz a diferenca na hora de atualizar, pois somente um objeto persistido, quando voce vai fazer o update, ele seta a atualizacao em cima das mudancas que voce fez. Exemplo:

pessoa.setNome(“Novo nome”);

dao.update(pessoa);

Agora ele ira atualizar somente o nome no banco.

Bom espero que tenha entendido.

Abraços.

R

Obrigado pela explicação, esclareceu algumas coisas, só que minha duvida é quanto a como utilizar estes conceitos, pq eu não escrevo nenhum new, e quando vou fazer update ou insert tmb nao escrevo nenhum setter, tudo isso acontece gerenciado pelo vraptor fazendo a comunicação entre meu front e o hibernate.

por exemplo, para enviar os dados para view eu uso o seguinte codigo:

public Pessoa carrega(Long id) {
		return (Pessoa) HibernateUtil.currentSession().createCriteria(Pessoa.class)
				.add(Restrictions.eq("id", id))
				.uniqueResult();
	}

e para fazer o update uso o seguinte codigo:

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

vc saberia me explicar como usar estes conceitos q vc me explicou nos meus codigos acima?

R

renatomattos2912:
Obrigado pela explicação, esclareceu algumas coisas, só que minha duvida é quanto a como utilizar estes conceitos, pq eu não escrevo nenhum new, e quando vou fazer update ou insert tmb nao escrevo nenhum setter, tudo isso acontece gerenciado pelo vraptor fazendo a comunicação entre meu front e o hibernate.

por exemplo, para enviar os dados para view eu uso o seguinte codigo:

public Pessoa carrega(Long id) {
		return (Pessoa) HibernateUtil.currentSession().createCriteria(Pessoa.class)
				.add(Restrictions.eq("id", id))
				.uniqueResult();
	}

e para fazer o update uso o seguinte codigo:

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

vc saberia me explicar como usar estes conceitos q vc me explicou nos meus codigos acima?

R

Xii mano, nao conheco o VRaptor, desculpa ‘-’

R

rof20004:

tudo isso acontece gerenciado pelo vraptor

Xii mano, nao conheco o VRaptor, desculpa ‘-’

Obrigado de qualquer forma

A

vc já tentou utilizar o metodo merge.
Exemplo, ao invés de

Vc faria

Criado 5 de dezembro de 2012
Ultima resposta 7 de dez. de 2012
Respostas 6
Participantes 3