Biblioteca JSFUtil

Pessoal Seguinte, eu baixei a biblioteca JSFUtil para apresentar mensagens de erro, abaixo segue a classe:

    package br.com.robson.sigor2.util;

    import javax.faces.application.FacesMessage;
    import javax.faces.context.FacesContext;

    public class JSFUtil {

    	public static void adicionarMenssagemSucesso(String mensagem) {

    		FacesMessage msg = new FacesMessage(FacesMessage.SEVERITY_INFO, mensagem, mensagem);
    		FacesContext contexto = FacesContext.getCurrentInstance();
    		contexto.addMessage(null, msg);
    	}

    	public static void adicionarMenssagemErro(String mensagem) {

    		FacesMessage msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, mensagem, mensagem);
    		FacesContext contexto = FacesContext.getCurrentInstance();
    		contexto.addMessage(null, msg);
    	}
    	
    	abaixo está um método que utilizei a classe, a lógica diz que se ele atender uma certa condição ele deve fazer um UPDATE no banco de dados:

    public void editar2() {
    		
    	
    	try {
    		DaoObra obra = new DaoObra();
    		ArrayList<DomainObras> lista_obra = obra.listar();
    		
    		for (DomainObras ob : lista_obra) {
    			if(manancial.getCod_digito() == ob.getCod_obra()){
    			
    				DaoManancial dao_manancial = new DaoManancial();
    				dao_manancial.editar(manancial);
    				JSFUtil.adicionarMenssagemSucesso("Manancial incluido !!");
    			
    			}else {
    			JSFUtil.adicionarMenssagemErro("Obra não existe");
    			}
    		}
    			
    			
    		} catch (SQLException e) {
    		
    			e.printStackTrace();
    		}
    		
    		
    }
        }

Até ai tudo bem, está funcionando e também está atualizando no banco de dados certinho. O problema são as mensagens de erro, por exemplo, quando a lógica acima não é atendida ele não faz o UPDATE, o que eu esperava, mas eu achei estranho é que ele apresenta três mensagens de erro, como na imagem a baixo:

E quando a lógica é atendida, ele faz o UPDATE certinho, porém aparece uma mensagem de sucesso e duas de erro, como na imagem abaixo:

Não entendo porque as mensagens de erro estão aparecendo triplicada dessa forma, e quando atende a condição porque aparece uma mensagem de sucesso e duas de erro?? Se alguém observou alguma coisa que eu não vi por favor me ajudem. Obrigado.

não tem porque isso acontecer

Ja entendi o erro, o for, ob.getCod_obra, armazena todos os codigos que tenho no ArrayList que traz de um banco de dados, no caso eu tenho 3 registros nesse banco de dados, e minha lógica estava comparando com os três. Fiz o teste adicionando mais um registro no banco de dados, aí apareceu 4 mensagens. Ou seja preciso encontrar outra lógica. Esta não deu certo. Obrigado a todos.

O problema é que vc está validando e já modificando dentro do for. Pra cada objeto do banco, ele executa o else dizendo que não encontrou. E quando encontra, ele faz o primeiro e continua nos outros pois não há um break. Na verdade, o seu for deve ser só para identificar se o objeto existe. A ação à ser tomada deve ficar do lado de fora. Algo como isto:

boolean objectFound = false;
for (DomainObras ob : lista_obra) {
	if(manancial.getCod_digito() == ob.getCod_obra()){
		objectFound = true;
		break;
	}    			
}

if(objectFound) {
	DaoManancial dao_manancial = new DaoManancial();
    dao_manancial.editar(manancial);
    JSFUtil.adicionarMenssagemSucesso("Manancial incluido !!");		
} else {
	JSFUtil.adicionarMenssagemErro("Obra não existe");
}

Além disso, tenho um conselho:

Por que, ao inves de buscar todos os objetos do banco de dados e fazer um loop, vc não faz logo um find usando o id que vc tem?

Pq, para 3 ou 4 linhas, isso funciona. Mas imagina se seu banco de dados tiver 100.000 registros? Vai trazer 100.000 itens do banco de dados para a memória e depois fazer um loop nesses 100.000?

O melhor à se fazer é: faça um find no banco de dados usando o ID que vc já tem. Se o banco de dados não retornar nada, então ele não existe e vc não faz o update. Se retornar alguma coisa, vc faz o update que precisa.

Muito obrigado, vou testar sua sugestão assim que chegar em casa. Fiquei muito interessado nesse método find. Vou pesquisar sobre ele. Se tiver algum link de algum material eu te agradeço. Obrigado mesmo.

Quando disse find, me refiro a operação de buscar 1 unico registro no banco de dados. Depende de como você está buscando seus dados no seu Dao.

Se estiver usando JPA/Hibernate:

Se estiver usando queries diretamente no banco de dados:

Meu amigo, muuuuuuuuuuuuuuuuuito obrigado, sua sugestão caiu como uma luva. Funcionou certinho. Vou usar esse método que me sugeriu, mas vou dar uma estudada nesses links que me mandou também. Muito obrigado.