XDoclet shortcoming?
scramer Dec 22, 2006 9:01 AMHello and merry christmas to everybody.
I'm using JBossIDE 2.0.0beta2.
The problem I am facing is with relations and the unknown-pk feature. I have two CMP EJBs:
package de.chitec.physio.server.ejb;
import java.rmi.RemoteException;
import java.util.Date;
import javax.ejb.EJBException;
import javax.ejb.EntityBean;
import javax.ejb.EntityContext;
import javax.ejb.RemoveException;
import org.apache.log4j.Logger;
/**
* @ejb.bean
* name="CMPPerson"
* display-name="CMPPerson"
* description="Description for CMPPerson"
* jndi-name="ejb/CMPPerson"
* type="CMP"
* cmp-version="2.x"
* view-type="local"
* reentrant = "false"
* local-jndi-name = "ejb/CMPPerson"
*
* @ejb.persistence
* table-name = "person"
*
* @ejb.pk
* class="java.lang.Object"
*
* @ejb.finder
* signature="java.util.Collection findByLastName(java.lang.String pLastName)"
* query="SELECT Object(o) FROM CMPPerson o WHERE o.lastName LIKE ?1"
*
* @jboss.entity-command
* name = "${jboss.entity.command}"
* class = "${jboss.entity.class}"
*
* @jboss.unknown-pk
* class="java.lang.Integer"
* column-name="id"
* jdbc-type="INTEGER"
* sql-type="INTEGER"
* auto-increment="true"
*
* @jboss.persistence
* pk-constraint = "true"
* table-name = "person"
*
*/
public abstract class CMPPersonBean implements EntityBean
{
public CMPPersonBean()
{
}
public void ejbActivate() throws EJBException, RemoteException
{
}
public void ejbLoad() throws EJBException, RemoteException
{
}
public void ejbPassivate() throws EJBException, RemoteException
{
}
public void ejbRemove() throws RemoveException, EJBException, RemoteException
{
}
public void ejbStore() throws EJBException, RemoteException
{
}
public void setEntityContext(EntityContext ctx) throws EJBException, RemoteException
{
}
public void unsetEntityContext() throws EJBException, RemoteException
{
}
/**
* Getter for CMP Field lastName.
*
* @return The person's lastname.
* @ejb.persistent-field
* @ejb.persistence column-name = "lastname" sql-type = "VARCHAR"
* @ejb.interface-method view-type="local"
*/
public abstract String getLastName();
/**
* Setter for CMP Field lastName.
*
* @param pLastName The person's lastname
* @ejb.interface-method view-type="local"
*/
public abstract void setLastName(String pLastName);
/**
* Create method.
*
* @ejb.create-method view-type = "local"
*/
public Object ejbCreate(String pLastName) throws javax.ejb.CreateException
{
setLastName(pLastName);
return null;
}
public void ejbPostCreate(String pLastName, String pFirstName, Date pBirthday) throws javax.ejb.CreateException
{
}
}
as well as
package de.chitec.physio.server.ejb;
import java.rmi.RemoteException;
import javax.ejb.EJBException;
import javax.ejb.EntityBean;
import javax.ejb.EntityContext;
import javax.ejb.RemoveException;
import de.chitec.physio.server.interfaces.CMPPersonLocal;
/**
* @ejb.bean
* name="CMPPatient"
* display-name="CMPPatient"
* description="Description for CMPPatient"
* jndi-name="ejb/CMPPatient"
* type="CMP"
* cmp-version="2.x"
* view-type="local"
* reentrant = "false"
* local-jndi-name = "ejb/CMPPatient"
*
* @ejb.persistence
* table-name = "patient"
*
* @ejb.pk
* class="java.lang.Object"
*
* @jboss.entity-command
* name = "${jboss.entity.command}"
* class = "${jboss.entity.class}"
*
* @jboss.unknown-pk
* class="java.lang.Integer"
* column-name="id"
* jdbc-type="INTEGER"
* sql-type="INTEGER"
* auto-increment="true"
*
* @jboss.persistence
* pk-constraint = "true"
* table-name = "patient"
*/
public abstract class CMPPatientBean implements EntityBean {
public CMPPatientBean() {
}
public void ejbActivate() throws EJBException, RemoteException {
}
public void ejbLoad() throws EJBException, RemoteException {
}
public void ejbPassivate() throws EJBException, RemoteException {
}
public void ejbRemove() throws RemoveException, EJBException, RemoteException {
}
public void ejbStore() throws EJBException, RemoteException {
}
public void setEntityContext(EntityContext ctx) throws EJBException, RemoteException {
}
public void unsetEntityContext() throws EJBException, RemoteException {
}
/**
* Getter for CMR Relationship
*
* @ejb.interface-method view-type="local"
* @ejb.relation name = "Patient-To-Person"
* role-name = "Patient-To-Person-Role"
* target-ejb = "CMPPerson"
* target-role-name = "Patient-Is-Person"
* target-multiple = "false"
*
* @jboss.relation related-pk-field = "id"
* fk-column = "person"
*
*/
public abstract CMPPersonLocal getPerson();
/**
* Setter for CMR Relationship
*
* @ejb.interface-method view-type="local"
*/
public abstract void setPerson(CMPPersonLocal value);
}
As you can see both CMPs use automagically generated PKs. Now for the problem:
Both of the contained beans work well if not linked via a relation. As soon as the relation comes in we got a problem. I know how it is supposed to be done (using jbosscmp-jdbc.xml). The relation code should be:
<ejb-relation> <foreign-key-mapping/> <ejb-relation-name>Patient-To-Person</ejb-relation-name> <ejb-relationship-role> <ejb-relationship-role-name> Patient-To-Person-Role </ejb-relationship-role-name> <key-fields /> </ejb-relationship-role> <ejb-relationship-role> <ejb-relationship-role-name> Patient-Is-Person </ejb-relationship-role-name> </ejb-relationship-role> </ejb-relation>
The problem is: I simply don't know how to generate the
<foreign-key-mapping/>tag via xdoclet.
Please, please, please - help.... :-)
Greetings
Sebastian