Problema no deploy de EntityBean CMP

Olá novamente,

Já faz uns três dias que eu tento fazer o deploy de um EntityBean simples no JBoss 4.0.0 e não consigo.
Vejam o erro:


14:42:50,791 INFO  [EjbModule] Deploying PequenoBean
14:43:04,577 ERROR [EntityContainer] Starting failed jboss.j2ee:jndiName=PequenoBean,service=EJB
org.jboss.deployment.DeploymentException: Error while creating table 
pequenos; - nested throwable: (org.postgresql.util.PSQLException: ERRO: 
erro de sintaxe em ou próximo a ")")
        at org.jboss.ejb.plugins.cmp.jdbc.JDBCStartCommand.createTable(JDBCStartCommand.java:540)
        at org.jboss.ejb.plugins.cmp.jdbc.JDBCStartCommand.execute(JDBCStartCommand.java:196)
        at org.jboss.ejb.plugins.cmp.jdbc.JDBCStoreManager.startStoreManager(JDBCStoreManager.java:484)
        at org.jboss.ejb.plugins.cmp.jdbc.JDBCStoreManager.start(JDBCStoreManager.java:381)
        at org.jboss.ejb.plugins.CMPPersistenceManager.start(CMPPersistenceManager.java:157)

(...o catatau de erro segue...)

O que pode ser?
Vejam meu ejb-jar.xml que está na pasta META-INF da aplicação

cabeçalho bla bla bla...
<enterprise-beans>
        
        <entity>
            <display-name>PequenoEB</display-name>
            <ejb-name>PequenoBean</ejb-name>
            <home>pequeno.PequenoRemoteHome</home>
            <remote>pequeno.PequenoRemote</remote>
            <ejb-class>pequeno.PequenoBean</ejb-class>
            <persistence-type>Container</persistence-type>
            <prim-key-class>pequeno.PequenoPK</prim-key-class>
            <reentrant>false</reentrant>
            <cmp-version>2.x</cmp-version>
            <abstract-schema-name>pequenos</abstract-schema-name>
            <cmp-field>
                <field-name>name</field-name>
            </cmp-field>
            <cmp-field>
                <field-name>codigo</field-name>
            </cmp-field>            
        </entity>
        
        </enterprise-beans>

Meu jbosscmp-jdbc.xml que está na pasta META-INF da aplicação

cabeçalho bla bla bla...
<jbosscmp-jdbc>
   <defaults>
             <datasource>java:/PostgresDS</datasource>
             <datasource-mapping>PostgreSQL 7.2</datasource-mapping>
   </defaults>
   <enterprise-beans>
   <entity>
      <ejb-name>PequenoBean</ejb-name>
      <table-name>pequenos</table-name>
      <cmp-field>
        <field-name>name</field-name>
        <column-name>name</column-name>
      </cmp-field>
      <cmp-field>
        <field-name>codigo</field-name>
        <column-name>codigo</column-name>
      </cmp-field>
    </entity>
   </enterprise-beans>
</jbosscmp-jdbc>

Meu postgres-ds.xml que está na pasta /server/default/deploy

<datasources>
  <local-tx-datasource>
    <jndi-name>PostgresDS</jndi-name>
    <connection-url>jdbc:postgresql://localhost:5432/pequeno</connection-url>
    <driver-class>org.postgresql.Driver</driver-class>
    <user-name>postgres</user-name>
    <password>postgres</password>
      <metadata>
         <type-mapping>PostgreSQL 7.2</type-mapping>
      </metadata>
  </local-tx-datasource>

</datasources>

O Driver do banco está na pasta /server/default/lib

Não consegui entender o que ele quer dizer com 'erro de sintaxe próximo do “(”'
Não sou eu quem gerencio essa porra!!
AEHUaeH
obrigado antes de tudo.

Tem um jeito de contornar isso se você já tiver o banco montado tudo direitinho, tabelas, campos iguais aos dos VOs.

No arquivo jbosscmp-jdbc.xml, você pode definir para ele não criar as tabelas. Veja:

 &lt;jbosscmp-jdbc&gt;
    &lt;defaults&gt;
              &lt;datasource&gt;java:/PostgresDS&lt;/datasource&gt;
              &lt;datasource-mapping&gt;PostgreSQL 7.2&lt;/datasource-mapping&gt;
              &lt;create-table&gt;false&lt;/create-table&gt;
              &lt;remove-table&gt;false&lt;/remove-table&gt;
    &lt;/defaults&gt;

    .... segue ....

&lt;/jbosscmp-jdbc&gt;

:lol:

Ótima idéia.
Consegui fazer o deploy.
Agora vou tentar usá-lo.

t+

Pessoal, terminei descobrindo a besteira.
Isso que eu fiz, com os conselhos do colega é uma gambiarra. E no fim das contas ao tentar rodar um cliente nesse Entity vai gerar erro.

A bronca era que:

  • O atributo que usei como chave primária tem que ser o mesmo em TODOS OS LUGARES, inclusive na classe de chave primária.

Não tentem entender baseado no erro. Esse erro é louco!

14:42:50,791 INFO  [EjbModule] Deploying PequenoBean
 14:43:04,577 ERROR [EntityContainer] Starting failed jboss.j2ee:jndiName=PequenoBean,service=EJB
 org.jboss.deployment.DeploymentException: Error while creating table 
 pequenos; - nested throwable: (org.postgresql.util.PSQLException: ERRO: 
 erro de sintaxe em ou próximo a ")")

Na classe PequenoPK eu usava um nome diferente do PequenoBean. Não imaginava nunca que pudesse ser isso. Posto que no ejb-jar.xml eu mapeio apenas o nome da classe de chave primária e o nome do cmp-field baseado no método acessador abstrato.

No ejb-jar.xml

...
             <cmp-field>
                 <field-name>codigo</field-name>
             </cmp-field>       
...

no jbosscmp-jdbc.xml

...
       <cmp-field>
         <field-name>codigo</field-name>
         <column-name>codigo</column-name>
       </cmp-field>
...

na classe PequenoPK


public class PequenoPK implements java.io.Serializable{
    
    public String codigo;    
    
    public PequenoPK() {
    }
...

na classe PequenoBean

import javax.ejb.*;

public abstract class PequenoBean implements EntityBean {
    private EntityContext context;
    
    public PequenoBean(){}
    public abstract java.lang.String getCodigo();
    public abstract void setCodigo(java.lang.String codigo);
...

Assim, o básico do CMP vai funcionar, quem quiser ir mais a fundo… pode mergulhar. Tem EJB-QL até umas hora!