Caros colegas, estou com um pequeno problema quando vou alterar um registro existente no meu banco.
Carrego normalmente os dados o objeto com “return (Idioma) session.load(Idioma.class, id)” e os envio para o formulário de edição:
[code]<form action="<c:url value="/idioma/atualiza" />" id=“dados” method=“post”>
<input type="hidden" name="idioma.ididioma" value="${idioma.ididioma}"/>
Idioma: <input type="text" name="idioma.nomeidioma" value="${idioma.nomeidioma}" />
<input type="hidden" name="idioma.idusuariomodificador" value="${usuarioLogado.id}" />
<input type="submit" value="Alterar" />
[/code]
A classe idioma utilizada acima segue logo abaixo:
[code]package br.com.uespi.biblioteca.model;
import java.util.Date;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
@Entity
public class Idioma {
@Id
@GeneratedValue
private Long ididioma;
private String nomeidioma;
private Long idusuariocriador;
@Temporal(TemporalType.DATE)
private Date datacriacao;
private Long idusuariomodificador;
@Temporal(TemporalType.DATE)
private Date datamodificacao;
…
[/code]
quando envio o formulário (com ou sem alteração), o objeto é atualizado, mas os campos que eu não declaro no formulário são setados como null, apagando desta forma informações que preciso, tais como a “datacriacao” de tal registro. Estou utilizando session.update(idioma) para atualizar, sendo que já testei com session.merge() tb e não funfou.
Como vocês têm feito para contornar essa situação?
Agradeço a atenção pessoal.
um dos jeitos é vc fazer o seguinte:
- carrega o Idioma do banco pelo id
- copie os campos que vc sabe que vão vir do formulário do que veio como parâmetro pro que veio do banco
não precisa nem fazer o update, se estiver dentro de uma transação o hibernate já faz o update automaticamente
Lucas, seria mais ou menos isso aqui?:
[code]public void atualiza(Idioma idioma){
try {
Idioma dbidioma = dao.carrega(idioma.getIdidioma());
dbidioma.setNomeidioma(idioma.getNomeidioma());
dbidioma.setIdusuariomodificador(idioma.getIdusuariomodificador());
dbidioma.setDatamodificacao(new Date());
dao.altera(dbidioma);
} catch (Exception e) {
e.printStackTrace();
}
result.include("message", "Dados alterados com sucesso.");
result.redirectTo(IdiomaController.class).lista();
}[/code]
Funfou legal utilizando try/catch. Mas terei que fazer isso sempre? e quanto a modelos que possuem trocentos atributos???
qual o motivo do try…catch?
a linha dao.altera(dbidioma) não é necessária, o hibernate vai fazer isso automaticamente
Lucas, o eclipse acusou que era necessário realizar um try…catch. E outra. neste trecho do código ainda não foi iniciada uma transação, esta é iniciada dentro do IndiomaDao.atualiza(idioma). No caso eu teria que copiar tudo pra lá?
se a transação está dentro do atualiza, então deixe como está…
o eclipse só vai te pedir pra fazer try…catch(Exeption) se algum dos métodos que vc está chamando está com throws Exception.
evite fazer isso
De boa então… vo tentar criar um mecanismo aqui genérico pra usar nas outras classes utilizando esta idéia aew.
Muito obrigado pela ajuda Lucas, notei que você é bastante ativo aqui no fórum.
Acho que posso dar este tópico como resolvido.
Lucas, só mais uma dúvida. Por curiosidade, a outra forma seria carregar todos os dados do objeto no formulário?
é outra forma, mas é um pouco insegura. Qualquer usuário malicioso do sistema pode editar os inputs hidden que vc colocaria no formulário e mudar campos que vc não queria que fossem mudados.