0 Replies Latest reply on Mar 20, 2007 2:52 PM by Martijn Verburg

    CMP Persistance 2.1 with HSQLDB on JBoss 4.0.5GA Failing?

    Martijn Verburg Newbie

      Hi all,

      I'm following through the OReilly's Enterprise JavaBeans 4th Edition using Jboss 4.0.5 GA (configured for J2EE1.4), with JDK 1.4.2_13 andusing the default inbuilt HSQLDB. I have come across a strange error when trying to find the entity bean I have created:

      ---------------------------------

      18:37:15,046 ERROR [CabinEJB#findByPrimaryKey] Find failed
      java.sql.SQLException: Unexpected token: FROM in statement [SELECT FROM CABINEJB t0_CabinEJB WHERE ]


      ---------------------------------

      I'm guessing the CMP code should have produced SQL which reads something like this:

      SELECT * FROM CABINEJB t0_CabinEJB WHERE id = ?


      ---------------------------------
      My ejb-jar.xml looks like this:
      ---------------------------------
      <enterprise-beans>
       <entity>
       <ejb-name>CabinEJB</ejb-name>
       <home>org.martijnverburg.ejb.CabinHomeRemote</home>
       <remote>org.martijnverburg.ejb.CabinRemote</remote>
       <ejb-class>org.martijnverburg.ejb.CabinBean</ejb-class>
       <persistence-type>Container</persistence-type>
       <prim-key-class>java.lang.Integer</prim-key-class>
       <reentrant>False</reentrant>
       <abstract-schema-name>Cabin</abstract-schema-name>
       <cmp-field>
       <field-name>id</field-name>
       </cmp-field>
       <cmp-field>
       <field-name>name</field-name>
       </cmp-field>
       <prim-key-field>id</prim-key-field>
       <security-identity>
       <use-caller-identity />
       </security-identity>
       </entity>
      </enterprise-beans>
      


      ---------------------------------
      My CabinHomeRemote looks like this:
      ---------------------------------
      package org.martijnverburg.ejb;
      
      <snip imports>
      
      public interface CabinHomeRemote extends EJBHome {
      
       public CabinRemote create(Integer id) throws CreateException, RemoteException;
      
       public CabinRemote findByPrimaryKey(Integer pk) throws FinderException, RemoteException;
      
      }
      

      ---------------------------------
      My CabinRemote looks like this:
      ---------------------------------
      package org.martijnverburg.ejb;
      
      <snip imports>
      
      public interface CabinRemote extends EJBObject {
      
       public String getName() throws RemoteException;
      
       public void setName(String name) throws RemoteException;
      }
      

      ---------------------------------
      My CabinBean looks like this:
      ---------------------------------
      package org.martijnverburg.ejb;
      
      <snip imports>
      
      public abstract class CabinBean implements EntityBean {
      
       public Integer ejbCreate(Integer id) throws CreateException {
       this.setId(id);
       return null;
       }
      
       public abstract void setId(Integer id);
      
       public abstract Integer getId();
      
       public abstract void setName(String name);
      
       public abstract String getName();
      
       <snip mandatory ejbX() methods>
      }
      

      ---------------------------------
      The calling client looks like this:
      ---------------------------------
      package org.martijnverburg.ejb.client;
      
      <snip imports>
      
      public class CabinBeanClient {
      
       public static void createCabin(Integer id, String name) {
       try {
      
       Context jndiContext = getInitialContext();
       Object ref = jndiContext.lookup("CabinHomeRemote");
       CabinHomeRemote home = (CabinHomeRemote)PortableRemoteObject.narrow(ref, CabinHomeRemote.class);
      
       CabinRemote cabin1 = home.create(id);
      
       cabin1.setName(name);
      
       } catch <snip catch blocks>
       }
      
       public static String findCabinName(Integer id) {
      
       String name = null;
      
       try {
       Context jndiContext = getInitialContext();
       Object ref = jndiContext.lookup("CabinHomeRemote");
       CabinHomeRemote home = (CabinHomeRemote)PortableRemoteObject.narrow(ref, CabinHomeRemote.class);
      
       // Find the bean
       CabinRemote cabin1 = home.findByPrimaryKey(id);
      
       // Get the attribute on that bean
       name = cabin1.getName();
       } catch <snip catch blocks>
      
       return name;
       }
      
       /**
       * Get the initial jndi context for this app server, so we can look
       * up entity beans etc.
       *
       * @return The context
       * @throws NamingException
       */
       private static Context getInitialContext() throws NamingException {
       // Calling this default constructor means that the jndi.properties gets
       // searched for and used on the classpath
       return new InitialContext();
       }
      }
      


      Any ideas? :)