Olá amigos!
Estou utilizando a anotação @Version do pacote javax.persistence para trabalhar a concorrência em minha aplicação Java EE 6. Porém quando utilizo try-catch para capturar a exceção e apenas exibir uma mensagem mais bem trabalhada para o usuário, a mesma continua explodindo na minha página web.
Abaixo um exemplo simples de como estou capturando a exceção:
public void salvar() {
FacesContext contexto = FacesContext.getCurrentInstance();
try {
aula.setStatusAula(StatusAula.AGENDADA);
this.aula = this.aulaDAO.salvar(aula);
this.listarAulas();
contexto.addMessage(null, new FacesMessage("Sucesso!", "Nova Aula criada com sequencial " + aula.getSequencial()));
} catch (org.hibernate.StaleObjectStateException sose) {
contexto.addMessage(null, new FacesMessage("Erro!", "Este registro está foi alterado por outro usuário. Repita a Operação!"));
aula = aulaDAO.buscarPorId(aula.getId());
}
}
A causa principal é mostrada assim:
Caused by: org.hibernate.StaleObjectStateException: Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect)
A anotação na classe modelo é simples:
@Version
public int getVersion() {
return version;
}
OBS 01: a aplicação é do Tipo Enterprise Application, e tem dois módulos dependentes: um WAR e um EAR. A classe modelo está no EAR e o ManagedBean que contém o método salvar exibido logo acima está no WAR.
OBS 02: Quando eu utilizo uma exceção mais genérica, como javax.ejb.EJBException, o tratamento com o try-catch funciona perfeitamente. Vejam a diferença na linha 07 deste exemplo:
try {
aula.setStatusAula(StatusAula.AGENDADA);
this.aula = this.aulaDAO.salvar(aula);
this.listarAulas();
contexto.addMessage(null, new FacesMessage("Sucesso!", "Nova Aula criada com sequencial " + aula.getSequencial()));
} catch (javax.ejb.EJBException ee) {
contexto.addMessage(null, new FacesMessage("Erro!", "Registro alterado por outro usuário!")); // Não posso afirmar que essa foi a causa!
aula = aulaDAO.buscarPorId(aula.getId()); // Por conta do tratamento genérico da exceção, isto pode gerar um NullPointerException!
}
Vale lembrar que aqui utilizo o servidor Glassfish 3.1 como servidor de aplicações, e as transações são controladas pelo servidor com recurso JDBC, além de utilizar o hibernate 3.6 como provider.
Alguém tem alguma solução?