MySQL Autoincrement Problem on CMP. Need help!!!
sunstarnova Oct 10, 2005 8:51 AMHi!
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; }