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

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:

[code]<?xml version="1.0" encoding="UTF-8"?>

nome_modulo ... EnderecoFacade EnderecoFacade caminho.pacote.fontes.EnderecoFacadeLocalHome caminho.pacote.fontes.EnderecoFacadeLocal caminho.pacote.fontes.EnderecoFacadeBean Stateless Container ejb/Endereco Entity caminho.pacote.fontes.EnderecoHome caminho.pacote.fontes.Endereco Endereco Endereco Endereco caminho.pacote.fontes.EnderecoHome caminho.pacote.fontes.Endereco caminho.pacote.fontes.EnderecoBean Container java.lang.Long false 2.x Endereco idEndereco ...[/code]

(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:

[code]<?xml version="1.0" encoding="UTF-8"?>

Endereco Endereco idEndereco ID_ENDERECO ...[/code]

Dentro de uma fachada (bem, um classe *Facade), realizo uma chamada para o método findByPrimaryKey, da seguinte forma:

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!

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:

[code]<?xml version='1.0' ?>

EnderecoFacade EnderecoFacade ejb/EnderecoFacade local/EnderecoFacade Endereco Endereco local/Endereco [/code]

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 :frowning: