sql-statement problem with xdocklet and mySQL
ruuit Jul 28, 2002 12:54 PMHi all,
I'm having problems to deploy a simple Address entity bean. I'm using xdoclet and mySQL 4.0. Address should be an EJB 2.0 local entity with cmp.
I'm adding some file content which I consider as possibly
helpful. The most important question for me is located at the end of this text.
Maybe somebody can help me without reading all those lines below.
Here is my ejb:
-------------------------------------------------------------------------------
package test.ejb.server;
import util.UUIDUtil;
import javax.ejb.*;
/**
* @ejb:bean name ="test.ejb.server.Address"
* jndi-name ="test.ejb.server.AddressHome"
* local-jndi-name="test.ejb.server.AddressHome"
* view-type ="local"
* type ="CMP"
* cmp-version ="2.x"
* schema ="test.ejb.server.Address"
* primkey-field ="id"
* @ejb:finder signature="Collection findAll()"
* @ejb:interface name ="test.ejb.server.Address"
* @ejb:pk class ="java.lang.String"
* generate ="true"
*
* @jboss:table-name address
* create-table true
* remove-table true
* read-only false
*/
public abstract class AddressBean implements EntityBean
{
private EntityContext ctx = null;
/**
* @ejb:interface-method
* @ejb:pk-field
* @ejb:persistent-field
*
* @jboss:cmp-field field-name ="id"
* column-name="id"
* @jboss:column-name id
* @jboss:jdbc-type VARCHAR
* @jboss:sql-type VARCHAR(32)
*/
public abstract String getId();
/**
* do not expose to interface, setting ids is not allowed from outside the bean
*/
public abstract void setId(String id);
/**
* @ejb:interface-method
* @ejb:persistent-field
*
* @jboss:cmp-field field-name ="street"
* column-name="street"
* @jboss:jdbc-type VARCHAR
* @jboss:sql-type VARCHAR(50)
*/
public abstract String getStreet();
/**
* @ejb:interface-method
*/
public abstract void setStreet(String street);
/**
* @ejb:interface-method
* @ejb:persistent-field
*
* @jboss:cmp-field field-name ="city"
* column-name="city"
* @jboss:jdbc-type VARCHAR
* @jboss:sql-type VARCHAR(50)
*/
public abstract String getCity();
/**
* @ejb:interface-method
*/
public abstract void setCity(String city);
public void ejbActivate()
{
}
public void ejbPassivate()
{
}
/**
* @ejb:create-method
*/
public String ejbCreate(String street, String city) throws CreateException
{
this.setId(UUIDUtil.instance().getUUID());
this.setStreet(street);
this.setCity( city);
return null;
}
public void ejbPostCreate(String street, String city)
{
}
public void ejbRemove() throws RemoveException
{
}
public void setEntityContext(EntityContext ctx)
{
this.ctx = ctx;
}
public void unsetEntityContext()
{
this.ctx = null;
}
}
-------------------------------------------------------------------------------
The first thing that seems strange to me is the following:
If I run ejbdoclet it says:
Message=[In element "entity" ist hier "local-jndi-name" nicht zulõssig.] is not
valid according to its DTD
(translation: in element "entity" "local-jndi-name" is not allowed)
I'm not sure if it is a problem to put an entity in different jndi trees using
the same name. (This is what I meant to do when I defined the local-jndi-name
and jndi-name attributes in the file above. Maybe it's not a good idea?)
ejbdoclet doesn't generate a jaws.xml nor a jbosscmp-jdbc.xml file. But even
if delete the local-jndi-name attribute in the file the message doesn't
disappear!?
Surprisingly if I run ejbdoclet again immediately it generates a jaws.xml-file
(but still no jbosscmp-jdbc.xml) and says:
Message=[In Element "cmp-field" ist hier "sql-type" nicht zulõssig.] is not
valid according to its DTD
(translation: in element "cmp-field" "sql-type" is not allowed)
If I delete the @jboss:sql-type tags it says "cmp-field requires additional
elements". What does ejbdoclet want me to do?
jbosscmp-jdbc.xml is still not generated.
If I then run ejbdoclet again immediately it generates a jbosscmp-jdbc.xml and
terminates without further complaints. Here is what I get:
jaws.xml ----------------------------------------------------------------------
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE jaws PUBLIC "-//JBoss//DTD JAWS 3.0//EN" "http://www.jboss.org/j2ee/dtd/jaws_3_0.dtd">
<jaws>
<datasource>java:/ruudatasource</datasource>
<type-mapping>mySQL</type-mapping>
<enterprise-beans>
<entity>
<ejb-name>test.ejb.server.Address</ejb-name>
<cmp-field>
<field-name>city</field-name>
<column-name>city</column-name>
<sql-type>VARCHAR(50)</sql-type>
<jdbc-type>VARCHAR</jdbc-type>
</cmp-field>
<cmp-field>
<field-name>id</field-name>
<column-name>id</column-name>
<sql-type>VARCHAR(32)</sql-type>
<jdbc-type>VARCHAR</jdbc-type>
</cmp-field>
<cmp-field>
<field-name>street</field-name>
<column-name>street</column-name>
<sql-type>VARCHAR(50)</sql-type>
<jdbc-type>VARCHAR</jdbc-type>
</cmp-field>
<table-name>address create-table false remove-table false read-only false</table-name>
<row-locking></row-locking>
</entity>
</enterprise-beans>
</jaws>
-------------------------------------------------------------------------------
jbosscmp-jdbc.xml--------------------------------------------------------------
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE jbosscmp-jdbc PUBLIC "-//JBoss//DTD JBOSSCMP-JDBC 3.0//EN" "http://www.jboss.org/j2ee/dtd/jbosscmp-jdbc_3_0.dtd">
<jbosscmp-jdbc>
<defaults>
<datasource>java:/ruudatasource</datasource>
<datasource-mapping>mySQL</datasource-mapping>
</defaults>
<enterprise-beans>
<entity>
<ejb-name>test.ejb.server.Address</ejb-name>
<table-name>address create-table false remove-table false read-only false</table-name>
<cmp-field>
<field-name>city</field-name>
<column-name>city</column-name>
<jdbc-type>VARCHAR</jdbc-type>
<sql-type>VARCHAR(50)</sql-type>
</cmp-field>
<cmp-field>
<field-name>id</field-name>
<column-name>id</column-name>
<jdbc-type>VARCHAR</jdbc-type>
<sql-type>VARCHAR(32)</sql-type>
</cmp-field>
<cmp-field>
<field-name>street</field-name>
<column-name>street</column-name>
<jdbc-type>VARCHAR</jdbc-type>
<sql-type>VARCHAR(50)</sql-type>
</cmp-field>
<!--
To define load groups for this entity, write a file named
jbosscmp-jdbc-load-AddressBean.xml and put it in
your mergedir. Write it according to the following DTD slice:
<!ELEMENT load-groups (load-group+)>
<!ELEMENT load-group (load-group-name, description?, field-name+)>
<!ELEMENT load-group-name (#PCDATA)>
<!ELEMENT description (#PCDATA)>
<!ELEMENT field-name (#PCDATA)>
<!ELEMENT eager-load-group (#PCDATA)>
<!ELEMENT lazy-load-groups (load-group-name+)>
-->
</entity>
</enterprise-beans>
<dependent-value-classes>
</dependent-value-classes>
</jbosscmp-jdbc>
-------------------------------------------------------------------------------
If I build a jar now, drop it into the deploy directory and start jboss it
fails deploying my address-bean. It tries to create a table and obviously
uses a statement with invalid syntax similar to the following:
CREATE TABLE address create-_15qn3yj (id VARCHAR(32) NOT NULL, street VARCHAR(50), city VARCHAR(50), CONSTRAINT pk_address crea_1mwi3go PRIMARY KEY (id))
Why is that "create-_15qn3yj" and "crea_1mwi3go" stuff in the statement?
Thanks a lot for any kind of help,
Roger