[RESOLVIDO!] "Surra" no if / else

13 respostas
Kleber-rr

Olá pessoal, bom dia...

Estou pegando uma surra no uso do if / else. Já li muitos posts mas ainda não achei o problema... No meu método String, para salvar, a única condição lida é a primeira:
if (unidadeSelecionado != null && controleSelecionado == null
				&& orgaogestorSelecionado != null) {
			funcionario.setOrgaogestor(og);
			funcionario.setUnidade(un);

		} else if (unidadeSelecionado == null && controleSelecionado != null //NAO É LIDA ...
				&& orgaogestorSelecionado == null) {
			funcionario.setControlesocial(cs);

		} else if (unidadeSelecionado == null && controleSelecionado == null //NÃO É LIDA ...
				&& orgaogestorSelecionado != null) {
			funcionario.setOrgaogestor(og);
		}

Por mais que eu satisfaça as condições seguintes, ele só lê a primeira condição e caso, não seja satisfeita, ao invés dela passar pra segunda, ela me retorna uma excepcion...

root cause

org.hibernate.ObjectNotFoundException: No row with the given identifier exists: [br.gov.rr.setrabes.estrutura.Unidade#0]
	org.hibernate.impl.SessionFactoryImpl$1.handleEntityNotFound(SessionFactoryImpl.java:377)
	org.hibernate.event.def.DefaultLoadEventListener.load(DefaultLoadEventListener.java:145)
	org.hibernate.event.def.DefaultLoadEventListener.returnNarrowedProxy(DefaultLoadEventListener.java:221)
	org.hibernate.event.def.DefaultLoadEventListener.proxyOrLoad(DefaultLoadEventListener.java:187)
	org.hibernate.event.def.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:103)
	org.hibernate.impl.SessionImpl.fireLoad(SessionImpl.java:878)
	org.hibernate.impl.SessionImpl.internalLoad(SessionImpl.java:846)
	org.hibernate.type.EntityType.resolveIdentifier(EntityType.java:557)
	org.hibernate.type.EntityType.resolve(EntityType.java:379)
	org.hibernate.type.EntityType.replace(EntityType.java:259)
	org.hibernate.type.AbstractType.replace(AbstractType.java:153)
	org.hibernate.type.TypeFactory.replace(TypeFactory.java:515)
	org.hibernate.event.def.DefaultMergeEventListener.copyValues(DefaultMergeEventListener.java:377)
	org.hibernate.event.def.DefaultMergeEventListener.entityIsTransient(DefaultMergeEventListener.java:179)
	org.hibernate.event.def.DefaultMergeEventListener.onMerge(DefaultMergeEventListener.java:123)
	org.hibernate.event.def.DefaultMergeEventListener.onMerge(DefaultMergeEventListener.java:53)
	org.hibernate.impl.SessionImpl.fireMerge(SessionImpl.java:677)
	org.hibernate.impl.SessionImpl.merge(SessionImpl.java:661)
	org.hibernate.impl.SessionImpl.merge(SessionImpl.java:665)
	br.gov.rr.setrabes.dao.Dao.merge(Dao.java:43)
	br.gov.rr.setrabes.handler.FuncionarioHandler.salva(FuncionarioHandler.java:458)
	sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
	sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	java.lang.reflect.Method.invoke(Method.java:616)
	org.apache.el.parser.AstValue.invoke(AstValue.java:172)
	org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:276)
	com.sun.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:68)
	javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:77)
	com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:91)
	javax.faces.component.UICommand.broadcast(UICommand.java:383)
	org.ajax4jsf.component.AjaxViewRoot.processEvents(AjaxViewRoot.java:186)
	org.ajax4jsf.component.AjaxViewRoot.broadcastEvents(AjaxViewRoot.java:164)
	org.ajax4jsf.component.AjaxViewRoot.processApplication(AjaxViewRoot.java:352)
	com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:97)
	com.sun.faces.lifecycle.LifecycleImpl.phase(LifecycleImpl.java:251)
	com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:117)
	javax.faces.webapp.FacesServlet.service(FacesServlet.java:244)
	org.ajax4jsf.webapp.BaseFilter.doFilter(BaseFilter.java:307)
	org.ajax4jsf.webapp.BaseXMLFilter.doXmlFilter(BaseXMLFilter.java:141)
	org.ajax4jsf.webapp.BaseFilter.doFilter(BaseFilter.java:281)
	br.gov.rr.setrabes.util.HibernateSessionFilter.doFilter(HibernateSessionFilter.java:21)

Eae pessoal, o que pode ser??

13 Respostas

R

É um erro do Hibernate.

org.hibernate.ObjectNotFoundException: No row with the given identifier exists:
br.gov.rr.setrabes.estrutura.Unidade#0

Crio manualmente no banco de dados na tabela unidade um objeto com o código 0?

Provavelmente você está usando a criação automática das tabelas no hibernate e suas foreign’s keys não estão corretas. (as vezes o hibernate não consegue criar automático).E você conseguiu excluir o que não devia. Existe alguma dependencia desse objeto…

Kleber-rr

Rafael, na verdade não existe esse id 0 no meu banco… mas pode me aparecer no erro tanto:

br.gov.rr.setrabes.estrutura.Unidade#0 br.gov.rr.setrabes.estrutura.Orgao#0 br.gov.rr.setrabes.estrutura.Controle#0

o problema é que o if else deveria analizar a primeira condição, e caso nao fosse compativel, passar pra segunda, nao é isso??

RafaelViana:
É um erro do Hibernate.

org.hibernate.ObjectNotFoundException: No row with the given identifier exists:
br.gov.rr.setrabes.estrutura.Unidade#0

Crio manualmente no banco de dados na tabela unidade um objeto com o código 0?

Provavelmente você está usando a criação automática das tabelas no hibernate e suas foreign’s keys não estão corretas. (as vezes o hibernate não consegue criar automático).E você conseguiu excluir o que não devia. Existe alguma dependencia desse objeto…

R

é achei estranho esse #0, pois quando vejo esse erro aqui o numero que está após o # é o id do objeto que está faltando.

Dê uma procurado no google sobre o erro, que acredito que irá resolver seu problema.
Elimine o erro e depois vamos para o problema do if/else.

Kleber-rr

RafaelViana:
é achei estranho esse #0, pois quando vejo esse erro aqui o numero que está após o # é o id do objeto que está faltando.

Dê uma procurado no google sobre o erro, que acredito que irá resolver seu problema.
Elimine o erro e depois vamos para o problema do if/else.

O problema todo é que, a minha aplicação, eu tenho esses 3 HtmlSelectOneMenu…

eu posso usar eles de forma alternada…

o problema é que, se eu deixar de preencher os dois ultimos destes 3, ele me retorna esse erro, entendeu?
por isso estou te dizendo que ele só lê a primeira condição dos IF, mas se esta primeira nao for satisfeita, ele nem lê as outras, e me retorna esse erro…

F

@Kleber-rr

Não entendi bem o problema, não sei o q vc quis dizer com o if não ser lido.

Considere o trecho de código abaixo:

if (condicao1){

bloco1;

}else if (condicao2){

bloco2;

}else if (condicao3){

bloco3;

}

É semelhante à sua estrutura de ifs aninhados. O que aconcete no seu código se
unidadeSelecionado == null, controleSelecionado == null e orgaogestorSelecionado == null ?

Nenhum dos blocos de códigos será executado.
O mesmo vale para
unidadeSelecionado == null, controleSelecionado != null e orgaogestorSelecionado != null
unidadeSelecionado != null, controleSelecionado != null e orgaogestorSelecionado == null
unidadeSelecionado != null, controleSelecionado == null e orgaogestorSelecionado == null

Se não fui desatento, em qq um destes casos, as condições de todos os seus ifs retornam false.
Seria este o problema?

Hebert_Coelho
Kleber-rr:
Olá pessoal, bom dia... Estou pegando uma surra no uso do if / else. Já li muitos posts mas ainda não achei o problema... No meu método String, para salvar, a única condição lida é a primeira:
if (unidadeSelecionado != null && controleSelecionado == null
				&& orgaogestorSelecionado != null) {
			funcionario.setOrgaogestor(og);
			funcionario.setUnidade(un);

		} else if (unidadeSelecionado == null && controleSelecionado != null //NAO É LIDA ...
				&& orgaogestorSelecionado == null) {
			funcionario.setControlesocial(cs);

		} else if (unidadeSelecionado == null && controleSelecionado == null //NÃO É LIDA ...
				&& orgaogestorSelecionado != null) {
			funcionario.setOrgaogestor(og);
		}

Eae pessoal, o que pode ser??

Cara, não executa por que quando vc colocar if/else em sequencia (aninhados) a primeira condição que ele encontrar, ele entra, executa e pronto.

Caso todos os if tenham ser executados, vc deve retirar o else.

Se ele tiver que entrar no terceiro if e não no primeiro, coloca esse terceiro if como primeiro.

Kleber-rr

Bom, vamos analisar…

if (unidadeSelecionado != null && controleSelecionado == null //ESTA FUNCIONA && orgaogestorSelecionado != null) { funcionario.setOrgaogestor(og); funcionario.setUnidade(un);
Se unidadeSelecionado não for nulo, controleSelecionado for nulo e orgaogestorSelecionado não for nulo: ele deveria grava no bd o id do orgaogestor e o id da unidade, mas não grava o do controlesocial;

} else if (unidadeSelecionado == null && controleSelecionado != null && orgaogestorSelecionado == null) { funcionario.setControlesocial(cs);
Se unidadeSelecionado for nulo, controleSelecionado não for nulo e orgaogestorSelecionado for nulo: ele deveria grava no bd apenas o id do controlesocial;

} else if (unidadeSelecionado == null && controleSelecionado == null && orgaogestorSelecionado != null) { funcionario.setOrgaogestor(og); }
Se unidadeSelecionado for nulo, controleSelecionado for nulo e orgaogestorSelecionado não for nulo: ele deveria grava no bd apenas o id do orgaogestor;

Como foi dito, a primeira condição quando é preenchida, ele salva o id do orgaogestor e da unidade, mas quando ela não é preenchida, ela nem lê as outras condições…

Hebert_Coelho
Kleber-rr:
Bom, vamos analisar... Como foi dito, a primeira condição quando é preenchida, ele salva o id do orgaogestor e da unidade, mas quando ela não é preenchida, ela nem lê as outras condições...

Cara, como eu te disse. Se ele entrar no primeiro if ele não irá executar o segundo ou o terceiro.

String nome = "jose";

if (nome.equals("jose"))
  System.out.println("um");
else
  System.out.println("dois");

Esse exemplo é bobo mas é a verdade. Ele nunk vai imprimir dois. Nunca! Como o if está seguido por else ele não vai passar pela segunda opção.

No seu caso é isso que acontece. Como ele sempre entra no primeiro, ele nunca vai passar pelo segundo.

Kleber-rr
jakefrog:
Kleber-rr:
Bom, vamos analisar... Como foi dito, a primeira condição quando é preenchida, ele salva o id do orgaogestor e da unidade, mas quando ela não é preenchida, ela nem lê as outras condições...

Cara, como eu te disse. Se ele entrar no primeiro if ele não irá executar o segundo ou o terceiro.

String nome = "jose";

if (nome.equals("jose"))
  System.out.println("um");
else
  System.out.println("dois");

Esse exemplo é bobo mas é a verdade. Ele nunk vai imprimir dois. Nunca! Como o if está seguido por else ele não vai passar pela segunda opção.

No seu caso é isso que acontece. Como ele sempre entra no primeiro, ele nunca vai passar pelo segundo.

Tinha razão. Mudei e agora ficou assim:
if (unidadeSelecionado != null) {
			funcionario.setOrgaogestor(og);
			funcionario.setUnidade(un);
			System.out.println("leu a primeira condicao do salvar");

		} else {
			System.out.println("ERRO NA primeira condicao do salvar");
		}

		if (controleSelecionado != null) {
			funcionario.setControlesocial(cs);
			System.out.println("leu a segunda condicao do salvar");
		} else {
			System.out.println("ERRO NA segunda condicao do salvar");
		}

		if (orgaogestorSelecionado != null) {
			funcionario.setOrgaogestor(og);
			System.out.println("leu a terceira condicao do salvar");
		} else {
			System.out.println("ERRO NA terceira condicao do salvar");
		}

O problema é que agora, ele tenta executar todas, mesmo não satisfazendo as condiçoes.

E agora?? :D

Hebert_Coelho

E agora q tu ta com problema de lógica e não de Java. Vc tem que ver qual condição que é necessária para cada ação.

Existe problema em realizar os 3 ifs?

Haha, eu estava olhando aqui… Vc mudou seus ifs, antes vc tinha 3 casos em cada if e agora tem um. Pq vc não tenta agora fazer o if/else? Com apenas uma condição?

Kleber-rr
jakefrog:
E agora q tu ta com problema de lógica e não de Java. Vc tem que ver qual condição que é necessária para cada ação.

Existe problema em realizar os 3 ifs?

Haha, eu estava olhando aqui... Vc mudou seus ifs, antes vc tinha 3 casos em cada if e agora tem um. Pq vc não tenta agora fazer o if/else? Com apenas uma condição?

Eae jakefrog, tentei fazer como vc disse. A questao é que se eu usar assim:
if (condição 1) {
System.out.println("resultado 1");
}
if (condiçao 2) {
System.out.println("resultado 2");
}
if (condicao 3) {
System.out.println("resultado 3");
}

Ele lê todas as condicoes, e executa os métodos dos resultados, nao importa se as condicoes forem supridas ou nao...

Cara, eu uso isso em outras classes, e funciona legal...

Tá complicado...

Kleber-rr

Resolvido.

Pessoal, era o seguinte:

Os If estavam certos.
if (condição 1) {
System.out.println("resultado 1");
}
if (condiçao 2) {
System.out.println("resultado 2");
}
if (condicao 3) {
System.out.println("resultado 3");
}

O problema é que como eu estava trabalhando com HtmlSelectOneMenu, querendo que em algum momento da minha lógica, estes fossem null, naum dava certo nunca... Só peguei o id deste objeto, e fiz a lógica em cima dele. Deu certo.

Hebert_Coelho
Kleber-rr:
Resolvido.

Pessoal, era o seguinte:

Os If estavam certos.
if (condição 1) {
System.out.println("resultado 1");
}
if (condiçao 2) {
System.out.println("resultado 2");
}
if (condicao 3) {
System.out.println("resultado 3");
}

O problema é que como eu estava trabalhando com HtmlSelectOneMenu, querendo que em algum momento da minha lógica, estes fossem null, naum dava certo nunca... Só peguei o id deste objeto, e fiz a lógica em cima dele. Deu certo.

Aew cara, parbéns. Quando tudo estiver mega complicado e nada parece andar levanta vai beber uma água... Relaxa um pouco e volta que sua mente clareia. [=

Qualquer coisa, é só chamar.

Criado 30 de julho de 2010
Ultima resposta 2 de ago. de 2010
Respostas 13
Participantes 4