estou inserindo dados com banco de dados usando o metodo save Generic,
estou querendo capturar a Exceção quando o usuário inserir um valor incorreto em um determinado campo,
dentro do metodo abaixo ele entra no catch, mas nos metodo que faz a chamada nesse metodo ele retorna como se não houvesse erro ao inserir,
como posso capturar essa exceção
[code]
public T save(T object) throws Exception {
try {
//Le as configurações de Banco configurada no persistence.xml
EntityManager em = new UtilFactoryDAO().getEntityManager();
//Abre a transação
em.getTransaction().begin();
// em.merge(object);
//persiste o objeto
em.persist(object);
//comita a transação
em.getTransaction().commit();
//Fecha p entity manager
em.close();
} catch (Exception e) {
e.printStackTrace();
}
return object;
}[/code]
O que você chama de “valor incorreto em um determinado campo”? Se o campo for um VARCHAR que armazena um CPF e no INSERT estiver algo como “bacon frito” não teria erro nenhum lançado. Isso você tem que validar antes de chegar na persistência.
por exemplo o usuário tentar inserir um valor “bacon frito” em um campo DATE ou NUMBER etc…[/quote]Seus atributos estão todos como String? Se sim isso seria possível acontecer. Se não, é como já lhe foi dito: isso já aconteceria antes.
Para forçar o erro acontecer dentro do seu try/catch você teria que chamar o método flush(); através do entity manager.
eu alterei meus objetos que estavam todos como String para Integer e Double (objeto e não primitivo) porém deu o mesmo erro,
tentei tb a alteração usando o metodo flush(); mas tb não funcionou conforme abaixo
@Override
public T save(T object) throws Exception {
try {
//Le as configurações de Banco configurada no persistence.xml
EntityManager em = new UtilFactoryDAO().getEntityManager();
//Abre a transação
em.getTransaction().begin();
// em.merge(object);
//persiste o objeto
em.persist(object);
em.flush();
//comita a transação
em.getTransaction().commit();
//Fecha p entity manager
em.close();
} catch (Exception e) {
e.printStackTrace();
}
return object;
}
[quote=thiagoRibeiro]eu alterei meus objetos que estavam todos como String para Integer e Double (objeto e não primitivo) porém deu o mesmo erro,[/quote]Que erro? Tinha que dar erro mesmo?
E o quê deveria estar errado? Você ainda não nos disse qual dado deveria ter dado erro e o motivo pelo qual deveria ter dado erro. Poste o código da entidade também.
Eu estou achando que o que você precisa é uma validação do objeto.
[quote=thiagoRibeiro]O problema e que deu o erro no meu metodo save isso no nivel do DAO,
quando chega no nível antes de exibir na tela a msg de sucesso ou erro deveria entrar no catch do meu
try{
}catch(Exception e){
e.printStackTrace();
}
mas não entra
entenderam ?[/quote]Então é melhor você estudar mais um pouco java antes de continuar com o JPA. Você ñ está fazendo nada com a expcetion se não mostrar o erro no console… e.printStackTrace(); …
Você tinha que jogar essa exception para o método que o está chamando…
Acho que não estou conseguindo passar corretamente o meu problema…Vou tentar dessa forma
Tenho 3 camadas em minha aplicação Delegate, BO, DAO
No delegate tenho um método parecido com o abaixo no qual faz uma chamada para a camada BO que faz uma chamada para o DAO,
ESTOU FORÇANDO um dado na tela para dar erro quando inserir um valor invalido no campo da tela, quando faço isso da um erro no meu método do DAO (ESTA CORRETO) e entra no meu catch, o que quero e que isso acontece quando eu ter o retorno no meu método no delegate (QUE E A 1° CHAMADA DEPOIS DA TELA QUE O USUÁRIO COLOCA AS INFORMAÇÕES) e dentro do catch eu uso o FacesMessage do JSF para mostrar na tela a msg para o usuário no caso do erro
Método na camada do DELEGATE
public String salvar() {
FacesContext context = FacesContext.getCurrentInstance();
boolean retorno = false;
try {
retorno = salvarObjetoBO.salvar(objeto);
if(retorno == true){
FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO, "Valores Salvo com Sucesso", "Valores Salvo com Sucesso");
context.addMessage("", message);
}else{
FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Ocorreu um erro ao Inserir os valores", "Ocorreu um erro ao Inserir os valores");
context.addMessage("", message);
}
} catch (Exception e) {
FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Ocorreu um erro ao Inserir os valores", "Ocorreu um erro ao Inserir os valores");
context.addMessage("", message);
e.printStackTrace();
}
return "retornaParaTela";
}
Fiz uma alteração no meu método do DAO alterando o tipo dele para um boolean, com isso lá no meu DELEGATE faço uma verificação para saber se inseriu as informações com sucesso ou não ai da certo o que eu quero Mas no caso de erro não entra no catch no meu delegate (sei que deu erro devido o retorno de false da minha variável no meu metodo do DAO)
public boolean save(T obj) {
//Le as configurações de Banco configurada no persistence.xml
EntityManager em = new UtilFactoryDAO().getEntityManager();
try {
//Abre a transação
em.getTransaction().begin();
// em.merge(object);
//persiste o objeto
em.persist(obj);
//comita a transação
em.getTransaction().commit();
em.flush();
//Fecha p entity manager
em.close();
return true;
} catch (Exception e) {
e.printStackTrace();
em.getTransaction().rollback();
return false;
} finally {
em.close();
}
}