1 Reply Latest reply on Oct 10, 2005 9:02 AM by Dennis Meyer

    MySQL Autoincrement Problem on CMP. Need help!!!

    Dennis Meyer Newbie

      Hi!

      I tried out everything, but it wont work as I always get an Exception. All Information is provided below!

      I'm working with Netbeans 5Beta. As EJB support is new, you have to do lots of the work by hand. I already had an application running as I mentioned that the automatic bean generation tool used some fioelds with index as primary keys! Therefore I changed it, but do not ged rid of the Exception while deploying.


      Database Table (datasource works perfectly!):

      CREATE TABLE `device_part` (
       `id` int(10) unsigned NOT NULL auto_increment,
       `device_id` int(10) unsigned NOT NULL default '0',
       `part_id` int(10) unsigned NOT NULL default '0',
       `type` varchar(6) default NULL,
       PRIMARY KEY (`id`),
       UNIQUE KEY `device_id__part_id__type` (`device_id`,`part_id`,`type`),
       KEY `device_id` (`device_id`),
       KEY `part_id` (`part_id`)
      ) TYPE=MyISAM COMMENT='NEW'
      



      My ejb-jar.xml
      <?xml version="1.0" encoding="UTF-8"?>
      <ejb-jar version="2.1" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/ejb-jar_2_1.xsd">
       <display-name>TestCmp-EJBModule</display-name>
       <enterprise-beans>
       <entity>
       <description>jdbc:mysql://localhost/ios [root on Default schema]</description>
       <display-name>DevicePartEB</display-name>
       <ejb-name>DevicePartBean</ejb-name>
       <local-home>testing.DevicePartLocalHome</local-home>
       <local>testing.DevicePartLocal</local>
       <ejb-class>testing.DevicePartBean</ejb-class>
       <persistence-type>Container</persistence-type>
       <prim-key-class>java.lang.Integer</prim-key-class>
       <reentrant>false</reentrant>
       <abstract-schema-name>DevicePart</abstract-schema-name>
       <cmp-field>
       <field-name>id</field-name>
       </cmp-field>
       <cmp-field>
       <field-name>deviceId</field-name>
       </cmp-field>
       <cmp-field>
       <field-name>partId</field-name>
       </cmp-field>
       <cmp-field>
       <field-name>type</field-name>
       </cmp-field>
       <!--
       <primkey-field>deviceId</primkey-field>
       -->
       <query>
       <description>auto generated method</description>
       <query-method>
       <method-name>findById</method-name>
       <method-params>
       <method-param>java.lang.Integer</method-param>
       </method-params>
       </query-method>
       <ejb-ql>SELECT OBJECT(d) FROM DevicePart AS d WHERE d.id = ?1</ejb-ql>
       </query>
       <query>
       <description>auto generated method</description>
       <query-method>
       <method-name>findByDeviceId</method-name>
       <method-params>
       <method-param>java.lang.Integer</method-param>
       </method-params>
       </query-method>
       <ejb-ql>SELECT OBJECT(d) FROM DevicePart AS d WHERE d.deviceId = ?1</ejb-ql>
       </query>
       <query>
       <description>auto generated method</description>
       <query-method>
       <method-name>findByPartId</method-name>
       <method-params>
       <method-param>java.lang.Integer</method-param>
       </method-params>
       </query-method>
       <ejb-ql>SELECT OBJECT(d) FROM DevicePart AS d WHERE d.partId = ?1</ejb-ql>
       </query>
       <query>
       <description>auto generated method</description>
       <query-method>
       <method-name>findByType</method-name>
       <method-params>
       <method-param>java.lang.String</method-param>
       </method-params>
       </query-method>
       <ejb-ql>SELECT OBJECT(d) FROM DevicePart AS d WHERE d.type = ?1</ejb-ql>
       </query>
       </entity>
       </enterprise-beans>
       <assembly-descriptor>
       <container-transaction>
       <method>
       <ejb-name>DevicePartBean</ejb-name>
       <method-name>*</method-name>
       </method>
       <trans-attribute>Required</trans-attribute>
       </container-transaction>
       </assembly-descriptor>
      </ejb-jar>
      
      


      The jboss.xml

      <?xml version="1.0" encoding="UTF-8"?>
      <jboss/>
      


      The jbosscmp-jdbc.xml
      <?xml version="1.0" encoding="UTF-8"?>
      <!DOCTYPE jbosscmp-jdbc PUBLIC "-//JBoss//DTD JBOSSCMP-JDBC 4.0//EN" "http://www.jboss.org/j2ee/dtd/jbosscmp-jdbc_4_0.dtd">
      
      <jbosscmp-jdbc>
       <defaults>
       <datasource>java:/oldios</datasource>
       <datasource-mapping>mySQL</datasource-mapping>
       <preferred-relation-mapping>foreign-key</preferred-relation-mapping>
       </defaults>
      
       <enterprise-beans>
      
       <!--
       To add beans that you have deployment descriptor info for, add
       a file to your XDoclet merge directory called jbosscmp-jdbc-beans.xml
       that contains the <entity></entity> markup for those beans.
       -->
      
       <entity>
       <ejb-name>DevicePartBean</ejb-name>
       <table-name>device_part</table-name>
       <cmp-field>
       <field-name>id</field-name>
       <column-name>id</column-name>
       <auto-increment/>
       </cmp-field>
       <cmp-field>
       <field-name>deviceId</field-name>
       <column-name>device_id</column-name>
       </cmp-field>
       <cmp-field>
       <field-name>partId</field-name>
       <column-name>part_id</column-name>
       </cmp-field>
       <cmp-field>
       <field-name>type</field-name>
       <column-name>type</column-name>
       </cmp-field>
       <!--
       <unknown-pk>
       <unknown-pk-class>java.lang.Integer</unknown-pk-class>
       <field-name>id</field-name>
       <column-name>id</column-name>
       <jdbc-type>INTEGER</jdbc-type>
       <sql-type>INTEGER</sql-type>
       <auto-increment/>
       </unknown-pk>
       -->
      
       <!--
       <unknown-pk>
       <unknown-pk-class>java.lang.Integer</unknown-pk-class>
       <field-name>id</field-name>
       <column-name>id</column-name>
       <jdbc-type>INTEGER</jdbc-type>
       <sql-type>INTEGER</sql-type>
       <auto-increment/>
       </unknown-pk>
       -->
       <entity-command name="mysql-get-generated-keys">
       </entity-command>
       </entity>
       </enterprise-beans>
      </jbosscmp-jdbc>
      
      



      THE BEANS:
      DevicePartBean
      package testing;
      
      import javax.ejb.*;
      
      /**
       * This is the bean class for the DevicePartBean enterprise bean.
       * Created 10.10.2005 13:34:11
       * @author adminmeyer
       */
      public abstract class DevicePartBean implements javax.ejb.EntityBean, testing.DevicePartLocalBusiness {
       private javax.ejb.EntityContext context;
      
       // <editor-fold defaultstate="collapsed" desc="EJB infrastructure methods. Click on the + sign on the left to edit the code.">
       // TODO Consider creating Transfer Object to encapsulate data
       // TODO Review finder methods
       /**
       * @see javax.ejb.EntityBean#setEntityContext(javax.ejb.EntityContext)
       */
       public void setEntityContext(javax.ejb.EntityContext aContext) {
       context = aContext;
       }
      
       /**
       * @see javax.ejb.EntityBean#ejbActivate()
       */
       public void ejbActivate() {
      
       }
      
       /**
       * @see javax.ejb.EntityBean#ejbPassivate()
       */
       public void ejbPassivate() {
      
       }
      
       /**
       * @see javax.ejb.EntityBean#ejbRemove()
       */
       public void ejbRemove() {
      
       }
      
       /**
       * @see javax.ejb.EntityBean#unsetEntityContext()
       */
       public void unsetEntityContext() {
       context = null;
       }
      
       /**
       * @see javax.ejb.EntityBean#ejbLoad()
       */
       public void ejbLoad() {
      
       }
      
       /**
       * @see javax.ejb.EntityBean#ejbStore()
       */
       public void ejbStore() {
      
       }
       // </editor-fold>
      
      
       public abstract java.lang.Integer getId();
       public abstract void setId(java.lang.Integer id);
      
       public abstract java.lang.Integer getDeviceId();
       public abstract void setDeviceId(java.lang.Integer deviceId);
      
       public abstract java.lang.Integer getPartId();
       public abstract void setPartId(java.lang.Integer partId);
      
       public abstract java.lang.String getType();
       public abstract void setType(java.lang.String type);
      
      
       public java.lang.Object ejbCreate(java.lang.Integer id, java.lang.Integer deviceId, java.lang.Integer partId, java.lang.String type) throws javax.ejb.CreateException {
       //if (id == null) {
       // throw new javax.ejb.CreateException("The field \"id\" must not be null");
       //}
       if (deviceId == null) {
       throw new javax.ejb.CreateException("The field \"deviceId\" must not be null");
       }
       if (partId == null) {
       throw new javax.ejb.CreateException("The field \"partId\" must not be null");
       }
      
       // TODO add additional validation code, throw CreateException if data is not valid
       setId(id);
       setDeviceId(deviceId);
       setPartId(partId);
       setType(type);
      
       return null;
       }
      
       public void ejbPostCreate(java.lang.Integer id, java.lang.Integer deviceId, java.lang.Integer partId, java.lang.String type) {
       // TODO populate relationships here if appropriate
      
       }
      }
      
      


      DevicePartLocal
      
      package testing;
      
      
      /**
       * This is the local interface for DevicePart enterprise bean.
       */
      public interface DevicePartLocal extends javax.ejb.EJBLocalObject, testing.DevicePartLocalBusiness {
      
      
      }
      
      


      DevicePartLocalBusiness
      
      package testing;
      
      
      /**
       * This is the business interface for DevicePart enterprise bean.
       */
      public interface DevicePartLocalBusiness {
       public abstract java.lang.Integer getId();
      
       public abstract void setId(java.lang.Integer id);
      
       public abstract java.lang.Integer getDeviceId();
      
       public abstract java.lang.Integer getPartId();
      
       public abstract void setPartId(java.lang.Integer partId);
      
       public abstract java.lang.String getType();
      
       public abstract void setType(java.lang.String type);
      
      }
      
      


      DevicePartLocalHome
      
      package testing;
      
      
      /**
       * This is the local-home interface for DevicePart enterprise bean.
       */
      public interface DevicePartLocalHome extends javax.ejb.EJBLocalHome {
      
      
      
       /**
       *
       */
       testing.DevicePartLocal findByPrimaryKey(java.lang.Integer key) throws javax.ejb.FinderException;
      
       public testing.DevicePartLocal create(java.lang.Integer id, java.lang.Integer deviceId, java.lang.Integer partId, java.lang.String type) throws javax.ejb.CreateException;
      
       java.util.Collection findById(java.lang.Integer id) throws javax.ejb.FinderException;
      
       java.util.Collection findByDeviceId(java.lang.Integer deviceId) throws javax.ejb.FinderException;
      
       java.util.Collection findByPartId(java.lang.Integer partId) throws javax.ejb.FinderException;
      
       java.util.Collection findByType(java.lang.String type) throws javax.ejb.FinderException;
      
      
      }