EJB 2.1 - java.sql.SQLException: Column not found

1 resposta
Alys

Boa tarde pessoal,

Tenho um sistema Java, bem antigo, contruído com EJB 2.1 e iBatis, atualmente em produção, e estamos com um projeto de migração para o JBoss 5.1. Porém, estou com alguns problemas que não consigo identificar a causa, provavelmente por meu pouco conhecimento com EJBs, principalmente 2.1.

Tenho em meu módulo EJB a seguinte estrutura:

Endereco
	|_(código-fonte)
	|_META-INF
		|_ejb-jar.xml
		|_jbosscmp-jdbc.xml
No arquivo ejb-jar, tenho a declaração da entidade da seguinte forma:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE ejb-jar PUBLIC "-//Sun Microsystems, Inc.//DTD Enterprise JavaBeans 2.0//EN" "http://java.sun.com/dtd/ejb-jar_2_0.dtd">
<ejb-jar>
  <display-name>nome_modulo</display-name>
  <enterprise-beans>
    ...
    <session>
      <display-name>EnderecoFacade</display-name>
      <ejb-name>EnderecoFacade</ejb-name>
      <local-home>caminho.pacote.fontes.EnderecoFacadeLocalHome</local-home>
      <local>caminho.pacote.fontes.EnderecoFacadeLocal</local>
      <ejb-class>caminho.pacote.fontes.EnderecoFacadeBean</ejb-class>
      <session-type>Stateless</session-type>
      <transaction-type>Container</transaction-type>
      <ejb-local-ref>
        <description />
        <ejb-ref-name>ejb/Endereco</ejb-ref-name>
        <ejb-ref-type>Entity</ejb-ref-type>
        <local-home>caminho.pacote.fontes.EnderecoHome</local-home>
        <local>caminho.pacote.fontes.Endereco</local>
        <ejb-link>Endereco</ejb-link>
      </ejb-local-ref>
    </session>
    <entity>
      <display-name>Endereco</display-name>
      <ejb-name>Endereco</ejb-name>
      <local-home>caminho.pacote.fontes.EnderecoHome</local-home>
      <local>caminho.pacote.fontes.Endereco</local>
      <ejb-class>caminho.pacote.fontes.EnderecoBean</ejb-class>
      <persistence-type>Container</persistence-type>
      <prim-key-class>java.lang.Long</prim-key-class>
      <reentrant>false</reentrant>
      <cmp-version>2.x</cmp-version>
      <abstract-schema-name>Endereco</abstract-schema-name>
      <cmp-field>
        <field-name>idEndereco</field-name>
      </cmp-field>
	  ...
(Obs: "caminho.pacote.fontes" é só um alias para o caminho real do pacote)

No arquivo jbosscmp-jdbc.xml, tenho definido o mapeamendo com o banco, da seguinte forma:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE jbosscmp-jdbc PUBLIC
     "-//JBoss//DTD JBOSSCMP-JDBC 3.2//EN"
     "file:///C:/Pasta/jbosscmp-jdbc_3_2.dtd">
<jbosscmp-jdbc>
  <enterprise-beans>
    <entity>
        <ejb-name>Endereco</ejb-name>
        <table-name>Endereco</table-name>
        <cmp-field>
          <field-name>idEndereco</field-name>
          <column-name>ID_ENDERECO</column-name>
        </cmp-field>
		...
Dentro de uma fachada (bem, um classe *Facade), realizo uma chamada para o método findByPrimaryKey, da seguinte forma:
Endereco Endereco =  getHome().findByPrimaryKey(id);

E o método para recuperar a home:

return (EnderecoHome) ServiceLocator.
          getInstance().getEjbLocalHome("java:comp/env/ejb/Endereco");

Porém, quando executo este método, recebo o erro:

ERROR [Endereco#findByPrimaryKey] Find failed
java.sql.SQLException: Column not found: T0_ENDERECO.ID_ENDERECO in statement [SELECT t0_Endereco.ID_ENDERECO FROM ENDERECO t0_Endereco WHERE t0_Endereco.ID_ENDERECO=?]
	at org.hsqldb.jdbc.Util.throwError(Unknown Source)
	at org.hsqldb.jdbc.Util.throwError(Unknown Source)
	at org.hsqldb.jdbc.jdbcPreparedStatement.<init>(Unknown Source)
	at org.hsqldb.jdbc.jdbcConnection.prepareStatement(Unknown Source)
	at org.jboss.resource.adapter.jdbc.BaseWrapperManagedConnection.doPrepareStatement(BaseWrapperManagedConnection.java:465)
	at org.jboss.resource.adapter.jdbc.BaseWrapperManagedConnection.prepareStatement(BaseWrapperManagedConnection.java:453)
	at org.jboss.resource.adapter.jdbc.WrappedConnection.prepareStatement(WrappedConnection.java:243)
	at org.jboss.ejb.plugins.cmp.jdbc.JDBCAbstractQueryCommand.execute(JDBCAbstractQueryCommand.java:227)
	at org.jboss.ejb.plugins.cmp.jdbc.JDBCAbstractQueryCommand.execute(JDBCAbstractQueryCommand.java:144)
	at org.jboss.ejb.plugins.cmp.jdbc.JDBCFindByPrimaryKeyQuery.execute(JDBCFindByPrimaryKeyQuery.java:155)
	at org.jboss.ejb.plugins.cmp.jdbc.JDBCFindEntityCommand.execute(JDBCFindEntityCommand.java:61)
	at org.jboss.ejb.plugins.cmp.jdbc.JDBCStoreManager.findEntity(JDBCStoreManager.java:604)
	at org.jboss.ejb.plugins.CMPPersistenceManager.findEntity(CMPPersistenceManager.java:315)
	at org.jboss.resource.connectionmanager.CachedConnectionInterceptor.findEntity(CachedConnectionInterceptor.java:234)
	at org.jboss.ejb.EntityContainer.findSingleObject(EntityContainer.java:1112)
	at org.jboss.ejb.EntityContainer.findLocal(EntityContainer.java:689)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:597)
	at org.jboss.invocation.Invocation.performCall(Invocation.java:386)
	at org.jboss.ejb.EntityContainer$ContainerInterceptor.invokeHome(EntityContainer.java:1139)
	at org.jboss.ejb.plugins.AbstractInterceptor.invokeHome(AbstractInterceptor.java:106)
	at org.jboss.ejb.plugins.EntitySynchronizationInterceptor.invokeHome(EntitySynchronizationInterceptor.java:203)
	at org.jboss.resource.connectionmanager.CachedConnectionInterceptor.invokeHome(CachedConnectionInterceptor.java:187)
	at org.jboss.ejb.plugins.AbstractInterceptor.invokeHome(AbstractInterceptor.java:106)
	at org.jboss.ejb.plugins.EntityInstanceInterceptor.invokeHome(EntityInstanceInterceptor.java:137)
	at org.jboss.ejb.plugins.EntityLockInterceptor.invokeHome(EntityLockInterceptor.java:76)
	at org.jboss.ejb.plugins.EntityCreationInterceptor.invokeHome(EntityCreationInterceptor.java:45)
	at org.jboss.ejb.plugins.CallValidationInterceptor.invokeHome(CallValidationInterceptor.java:56)
	at org.jboss.ejb.plugins.AbstractTxInterceptor.invokeNext(AbstractTxInterceptor.java:125)
	at org.jboss.ejb.plugins.TxInterceptorCMT.runWithTransactions(TxInterceptorCMT.java:350)
	at org.jboss.ejb.plugins.TxInterceptorCMT.invokeHome(TxInterceptorCMT.java:161)
	at org.jboss.ejb.plugins.SecurityInterceptor.process(SecurityInterceptor.java:230)
	at org.jboss.ejb.plugins.SecurityInterceptor.invokeHome(SecurityInterceptor.java:205)
	at org.jboss.ejb.plugins.security.PreSecurityInterceptor.process(PreSecurityInterceptor.java:99)
	at org.jboss.ejb.plugins.security.PreSecurityInterceptor.invokeHome(PreSecurityInterceptor.java:88)
	at org.jboss.ejb.plugins.LogInterceptor.invokeHome(LogInterceptor.java:132)
	at org.jboss.ejb.plugins.ProxyFactoryFinderInterceptor.invokeHome(ProxyFactoryFinderInterceptor.java:107)
	at org.jboss.ejb.EntityContainer.internalInvokeHome(EntityContainer.java:527)
	at org.jboss.ejb.Container.invoke(Container.java:1046)
	at org.jboss.ejb.plugins.local.BaseLocalProxyFactory.invokeHome(BaseLocalProxyFactory.java:362)
	at org.jboss.ejb.plugins.local.LocalHomeProxy.invoke(LocalHomeProxy.java:133)
	at $Proxy1253.findByPrimaryKey(Unknown Source)
	at caminho.pacote.fontes.EnderecoFacadeBean.getByPrimaryKey(EnderecoFacadeBean.java:326)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:597)
	at org.jboss.invocation.Invocation.performCall(Invocation.java:386)
	at org.jboss.ejb.StatelessSessionContainer$ContainerInterceptor.invoke(StatelessSessionContainer.java:228)
	at org.jboss.resource.connectionmanager.CachedConnectionInterceptor.invoke(CachedConnectionInterceptor.java:156)
	at org.jboss.ejb.plugins.StatelessSessionInstanceInterceptor.invoke(StatelessSessionInstanceInterceptor.java:173)
	at org.jboss.ejb.plugins.CallValidationInterceptor.invoke(CallValidationInterceptor.java:63)
	at org.jboss.ejb.plugins.AbstractTxInterceptor.invokeNext(AbstractTxInterceptor.java:121)
	at org.jboss.ejb.plugins.TxInterceptorCMT.runWithTransactions(TxInterceptorCMT.java:350)
	at org.jboss.ejb.plugins.TxInterceptorCMT.invoke(TxInterceptorCMT.java:181)
	at org.jboss.ejb.plugins.SecurityInterceptor.process(SecurityInterceptor.java:228)
	at org.jboss.ejb.plugins.SecurityInterceptor.invoke(SecurityInterceptor.java:211)
	at org.jboss.ejb.plugins.security.PreSecurityInterceptor.process(PreSecurityInterceptor.java:97)
	at org.jboss.ejb.plugins.security.PreSecurityInterceptor.invoke(PreSecurityInterceptor.java:81)
	at org.jboss.ejb.plugins.LogInterceptor.invoke(LogInterceptor.java:205)
	at org.jboss.ejb.plugins.ProxyFactoryFinderInterceptor.invoke(ProxyFactoryFinderInterceptor.java:138)
	at org.jboss.ejb.SessionContainer.internalInvoke(SessionContainer.java:650)
	at org.jboss.ejb.Container.invoke(Container.java:1029)
	at org.jboss.ejb.plugins.local.BaseLocalProxyFactory.invoke(BaseLocalProxyFactory.java:436)
	at org.jboss.ejb.plugins.local.StatelessSessionProxy.invoke(StatelessSessionProxy.java:103)
	at $Proxy1270.getByPrimaryKey(Unknown Source)
	at caminho.pacote.fontes.EnderecoDelegateBean.getByPrimaryKey(EnderecoDelegateBean.java:81)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:597)
	at org.jboss.invocation.Invocation.performCall(Invocation.java:386)
	at org.jboss.ejb.StatelessSessionContainer$ContainerInterceptor.invoke(StatelessSessionContainer.java:228)
	at org.jboss.resource.connectionmanager.CachedConnectionInterceptor.invoke(CachedConnectionInterceptor.java:156)
	at org.jboss.ejb.plugins.StatelessSessionInstanceInterceptor.invoke(StatelessSessionInstanceInterceptor.java:173)
	at org.jboss.ejb.plugins.CallValidationInterceptor.invoke(CallValidationInterceptor.java:63)
	at org.jboss.ejb.plugins.AbstractTxInterceptor.invokeNext(AbstractTxInterceptor.java:121)
	at org.jboss.ejb.plugins.TxInterceptorCMT.runWithTransactions(TxInterceptorCMT.java:350)
	at org.jboss.ejb.plugins.TxInterceptorCMT.invoke(TxInterceptorCMT.java:181)
	at org.jboss.ejb.plugins.SecurityInterceptor.process(SecurityInterceptor.java:228)
	at org.jboss.ejb.plugins.SecurityInterceptor.invoke(SecurityInterceptor.java:211)
	at org.jboss.ejb.plugins.security.PreSecurityInterceptor.process(PreSecurityInterceptor.java:97)
	at org.jboss.ejb.plugins.security.PreSecurityInterceptor.invoke(PreSecurityInterceptor.java:81)
	at org.jboss.ejb.plugins.LogInterceptor.invoke(LogInterceptor.java:205)
	at org.jboss.ejb.plugins.ProxyFactoryFinderInterceptor.invoke(ProxyFactoryFinderInterceptor.java:138)
	at org.jboss.ejb.SessionContainer.internalInvoke(SessionContainer.java:650)
	at org.jboss.ejb.Container.invoke(Container.java:1029)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:597)
	at org.jboss.mx.interceptor.ReflectedDispatcher.invoke(ReflectedDispatcher.java:157)
	at org.jboss.mx.server.Invocation.dispatch(Invocation.java:96)
	at org.jboss.mx.server.Invocation.invoke(Invocation.java:88)
	at org.jboss.mx.server.AbstractMBeanInvoker.invoke(AbstractMBeanInvoker.java:264)
	at org.jboss.mx.server.MBeanServerImpl.invoke(MBeanServerImpl.java:668)
	at org.jboss.invocation.local.LocalInvoker$MBeanServerAction.invoke(LocalInvoker.java:169)
	at org.jboss.invocation.local.LocalInvoker.invoke(LocalInvoker.java:118)
	at org.jboss.invocation.InvokerInterceptor.invokeLocal(InvokerInterceptor.java:209)
	at org.jboss.invocation.InvokerInterceptor.invoke(InvokerInterceptor.java:195)
	at org.jboss.proxy.TransactionInterceptor.invoke(TransactionInterceptor.java:61)
	at org.jboss.proxy.ejb.SecurityContextInterceptor.invoke(SecurityContextInterceptor.java:64)
	at org.jboss.proxy.SecurityInterceptor.invoke(SecurityInterceptor.java:68)
	at org.jboss.proxy.ejb.StatelessSessionInterceptor.invoke(StatelessSessionInterceptor.java:112)
	at org.jboss.proxy.ClientContainer.invoke(ClientContainer.java:101)
	at $Proxy314.getByPrimaryKey(Unknown Source)
	at caminho.pacote.fontes.EnderecoClient.getByPrimaryKey(EnderecoClient.java:65)
	at caminho.pacote.fontes.PesquisaEnderecoAction.consultaEndereco(PesquisaAction.java:68)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:597)
	at caminho.pacote.fontes.NomeProjetoAction.execute(NomeProjetoAction.java:311)
	at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:419)
	at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:224)
	at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1194)
	at org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:414)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:235)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
	at org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(SecurityAssociationValve.java:190)
	at org.jboss.web.tomcat.security.JaccContextValve.invoke(JaccContextValve.java:92)
	at org.jboss.web.tomcat.security.SecurityContextEstablishmentValve.process(SecurityContextEstablishmentValve.java:126)
	at org.jboss.web.tomcat.security.SecurityContextEstablishmentValve.invoke(SecurityContextEstablishmentValve.java:70)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
	at org.jboss.web.tomcat.service.jca.CachedConnectionValve.invoke(CachedConnectionValve.java:158)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:330)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:829)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:598)
	at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
	at java.lang.Thread.run(Thread.java:619)
16:15:56,078 ERROR [NomeProjetoException]
E, não consegui ainda identificar a causa do problema. Uma coisa que me chamou a atenção é a coluna acusada de não existir estar em maiúsculo, e no SQL em minúsculo. Isso não faz diferença em SQL, eu sei, mas, sei lá, em Java faz, e isso me chamou a atenção. Mas, creio eu este comando é gerado automaticamente, então não sei como poderia corrigir.

Posso afirmar que na tabela de Endereço, existe um campo ID_ENDERECO. Se eu executar o comando exatamente como está entre [] (acrescentando o ID), ele executa e em retorna exatamente o registro que quero.

Efetuei um debug do código, a exceção estoura exatamente na chamada para o método findByPrimaryKey(id). Não são levantados problemas ao recuperar o ServiceLocator ou a Home.

Obs: não faço a mais remota idéia do por quê os fontes estão estruturados dessa forma, esse projeto tem 10 anos, ninguém que participou da construção está na empresa mais. Sei que, a não ser por justificativa técnica bem convincente, não tenho autorização para mudar isso (digamos que o que eu tiver que alterar em termos de fonte para este módulo de endereço, terei que replicar em 73 outros módulos).

Alguém já passou por problema similar, ou sabe o que poderia causar isto? Como tenho pouco conhecimento em EJBs (usava mais Spring), não sei se coloquei todos os arquivos necessários, se for necessário mais algum, é só me falar que colocarei aqui.

Obrigada!

1 Resposta

Alys

Acrescentando algumas informações complementares...

Configuração do datasource:

Eu li a respeito de colocar a referência ao datasource no arquivo jbosscmp-jdbc.xml, mas, eu estou usando através do arquivo oracle-ds.xml. Pensei em replicar do mesmo jeito, mas, pelo tipo de erro, creio que não há problemas com a conexão em si. Uma coisa, reparei que a string de conexão utilizava OCI, eu mudei para thin e, por via das dúvidas, baixei a última versão do driver (utilizamos Oracle 9i).

Arquivo jboss.xml:

Ele existe, mas, reparei que não está no local certo na estrutura de pastas, o movi para dentro de META-INF. A configuração no mesmo está da seguinte forma:
<?xml version='1.0' ?>
<!DOCTYPE jboss PUBLIC
   "-//JBoss//DTD JBOSS 3.2//EN"
   "http://www.jboss.org/j2ee/dtd/jboss_3_2.dtd">

<jboss>
   <enterprise-beans>
      <session>
	      <ejb-name>EnderecoFacade</ejb-name>
	      <jndi-name>EnderecoFacade</jndi-name>	
	      <ejb-local-ref>
	        <ejb-ref-name>ejb/EnderecoFacade</ejb-ref-name>
	        <local-jndi-name>local/EnderecoFacade</local-jndi-name> 
	      </ejb-local-ref>
      </session>
      <entity>
         <ejb-name>Endereco</ejb-name>
         <jndi-name>Endereco</jndi-name>
         <local-jndi-name>local/Endereco</local-jndi-name> 
      </entity>
   </enterprise-beans>
</jboss>

Uma última informação, talvez seja útil: o projeto hoje funciona no servidor de aplicação da Borland, o BES (cuja existência eu confesso que desconhecia).

Nenhuma das alterações que fiz com relação ao driver resolveram, e o problema persiste :(

Criado 17 de maio de 2011
Ultima resposta 18 de mai. de 2011
Respostas 1
Participantes 1