Update null no Hibernate JSP

Olá estou fazendo um formulario seguindo a apostila do vraptor mas tive o seguinte problema:

Quando eu mando atualizar o campo no banco se o mesmo estiver null ele da o update setando como null no banco como faço para que ele só altere os campos que tiverem algo dentro ?

Não sei como está fazendo, mas será que assim não resolve?

if (! campo == null ){
   campo.update();
}

Carrega o objeto do banco, e da um set nos atributos que voce alterou.

não resolve pq o campo em questão não é carregado no Formulario eu seto ele por tras dos panos então se eu disser que el é null ele nunca vai dar o update…

O ideal seria se o hibernate só atualizasse os campos que não fossem null

e como eu faria isso ?

Como voce pega o objeto do formulario ?

No meu caso uso Struts 1, e seto um objeto no mesmo, depois uso DynaActionForm formularioObjeto,

Depois o Objeto em java, ObjetoTO objeto = fomularioObjeto.get(“objeto”);

Se voce nao estiver usando struts 1 nem copie esse codigo :smiley:

Como voce pega um objeto do formulario ?

[quote=rof20004]Como voce pega o objeto do formulario ?

No meu caso uso Struts 1, e seto um objeto no mesmo, depois uso DynaActionForm formularioObjeto,

Depois o Objeto em java, ObjetoTO objeto = fomularioObjeto.get(“objeto”);

Se voce nao estiver usando struts 1 nem copie esse codigo :smiley:

Como voce pega um objeto do formulario ?[/quote]

segui sua linha de raciocínio…

Recuperei o dado ja salvo no banco mas o hibernate me deu essa excessão:

br.com.caelum.vraptor.InterceptionException: exception raised, check root cause for details: org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session: [br.com.wrk.model.Empreendedor#1]

Meu Código esta assim:

		if (empreendedor.getEstado().equals("Selecione")) {
			empreendedor.setEstado(dao.carrega(empreendedor.getId()).getEstado());
		}
		dao.salva(empreendedor);

se eu retiro o if ele grava o Selecione no lugar do estado se eu coloco ele ele da a excessão :confused:

a different object with the same identifier value was already associated with the session

Isso quer dizer que voce esta setando 2 objetos para persistir na base de dados.

Desfaz todos os objetos criados, vamo comecar do zero:

  1. Crie um objeto que pega os dados do banco, de acordo com o ID que vem do formulario.
  2. Pegue o objeto do form.
  3. Sete outro objeto com os dados que vem DO FORM.
  • Integer idQuevemDoFormulario = Integer.valueOf(request.getAttribute(“idObjeto”).toString());
  • ObjetoTO objetoQueVaiPersistir = objetoDAO.getPorId(idQuevemDoFormulario);
  • DynaActionForm objetoForm = new DynaActionForm();
  • ObjetoTO objetoNew = objetoForm.get(“objeto”);
  1. Agora sete as mudancas no objetoQueVaiPersistir (Ele que abriu uma session com o banco, entao ele que tem que ser persistido, entendeu agora o porque do erro ?)

// Aqui voce vai setar SOMENTE as variaveis que voce alterou. Geralmente os campos da alteracao sao pre-definidos no formulario, entao so setar os mesmo.
// Por exemplo, o meu objeto tem N variaveis, mas no form de alteracao so altero 2. Nome e Endereco.

  • objetoQueVaiPersistir.setNome(objetoNew.getNome());
  • objetoQueVaiPersistir.setEndereco(objetoNew.getEndereco());

Se voce tiver definido as variaveis no struts nem precisa setar outro objeto com os dados do form, pode usar o request.getAttribute diretamente no objetoQueVaiPersistir, exemplo: objetoQueVaiPersistir.setNome(request.getAttribute(“nome”).toString());

Por ultimo: objetoDAO.UPDATE(objetoQueVaiPersistir);

Tendeu ?