The problem of the business method inside CMP2.0 Bean
billhuangyu Mar 8, 2002 10:34 AMI currently use JBoss3.0.0 Beta2(07/03/2002 CVS) with mysql, I can successfully create entity bean and the record inside the mysql. But when I call the business method to transfer the amount from one entity bean to another, and I got the exception like below, anyone can help? Thank you. The code about my programme and configuration list as below.
--------------------------------Distributor.java
package examples.distributor;
import java.rmi.RemoteException;
import javax.ejb.EJBObject;
import javax.ejb.CreateException;
import javax.ejb.FinderException;
public interface Distributor extends EJBObject {
public void addOffice(String location, String[] salesReps,
double[] salesVolume)
throws CreateException, RemoteException;
public void correctTransferOfSalesReps(String originalLocation,
String newLocation, double minVolume)
throws RemoteException, FinderException;
}
------------------------------------------------DistributorHome.java
package examples.distributor;
import java.rmi.RemoteException;
import javax.ejb.EJBHome;
import javax.ejb.FinderException;
import javax.ejb.CreateException;
public interface DistributorHome extends EJBHome {
public Distributor create(String distributorName)
throws CreateException, RemoteException;
public Distributor findByPrimaryKey(String distributorName)
throws FinderException, RemoteException;
}
--------------------------------------------------DistributorBean.java
package examples.distributor;
import java.util.Collection;
import java.util.Iterator;
import javax.naming.InitialContext;
import javax.ejb.EntityBean;
import javax.ejb.EntityContext;
import javax.ejb.CreateException;
import javax.ejb.FinderException;
import javax.ejb.EJBException;
public abstract class DistributorBean implements EntityBean {
public abstract String getDistributorName();
public abstract void setDistributorName(String distributorName);
public abstract Collection getOffices();
public abstract void setOffices(Collection offices);
public abstract SalesOfficeLocal ejbSelectSalesOffice(
String distributorName, String salesRepName) throws FinderException;
public void addOffice(String location, String[] salesReps,
double[] salesVolume) throws CreateException {
SalesOfficeLocal salesOffice = createOffice(location);
for (int iter=0; iter<salesReps.length; iter++) {
SalesRepLocal salesRep = createSalesRep(salesReps[iter],
salesVolume[iter]);
salesOffice.getSalesReps().add(salesRep);
}
getOffices().add(salesOffice);
}
public void correctTransferOfSalesReps(String originalLocationName,
String newLocationName, double minVolume)
throws FinderException {
SalesOfficeLocal originalLocation = ejbSelectSalesOffice(
getDistributorName(), originalLocationName);
SalesOfficeLocal newLocation = ejbSelectSalesOffice(
getDistributorName(), newLocationName);
Iterator iterRepsOriginal = originalLocation.getSalesReps().iterator();
while (iterRepsOriginal.hasNext()) {
SalesRepLocal rep = (SalesRepLocal) iterRepsOriginal.next();
if (rep.getSalesVolume() >= minVolume) {
iterRepsOriginal.remove();
newLocation.getSalesReps().add(rep);
}
}
}
public SalesOfficeLocal createOffice(String location)
throws CreateException {
try {
InitialContext initial = new InitialContext();
SalesOfficeLocalHome home = (SalesOfficeLocalHome)
initial.lookup("ejb/SalesOfficeEJB");
return home.create(location);
} catch (Exception e) {
throw new javax.ejb.EJBException(e);
}
}
public SalesRepLocal createSalesRep(String repName, double salesVolume)
throws CreateException {
try {
InitialContext initial = new InitialContext();
SalesRepLocalHome home = (SalesRepLocalHome)
initial.lookup("ejb/SalesRepEJB");
return home.create(repName, salesVolume);
} catch (Exception e) {
throw new javax.ejb.EJBException(e);
}
}
public String ejbCreate(String distributorName)
throws CreateException {
setDistributorName(distributorName);
return null;
}
public void ejbPostCreate(String distributorName)
throws CreateException {}
public void ejbActivate() {}
public void ejbLoad() {}
public void ejbPassivate() {}
public void ejbRemove() {}
public void ejbStore() {}
public void setEntityContext(EntityContext ctx) {}
public void unsetEntityContext() {}
}
--------------------------------------------------SalesOfficeLocal.java
package examples.distributor;
import java.util.Collection;
import javax.ejb.EJBLocalObject;
public interface SalesOfficeLocal extends EJBLocalObject {
public String getLocation();
public Collection getSalesReps();
public void setSalesReps(Collection salesReps);
}
----------------------------------------------------------SalesOfficeLocalHome.java
package examples.distributor;
import javax.ejb.EJBLocalHome;
import javax.ejb.FinderException;
import javax.ejb.CreateException;
public interface SalesOfficeLocalHome extends EJBLocalHome {
public SalesOfficeLocal findByPrimaryKey(String location)
throws FinderException;
public SalesOfficeLocal create(String location)
throws CreateException;
}
-------------------------------------------------------------SalesOfficeBean.java
package examples.distributor;
import java.util.Collection;
import javax.ejb.EntityBean;
import javax.ejb.EntityContext;
import javax.ejb.CreateException;
public abstract class SalesOfficeBean implements EntityBean {
public abstract String getLocation();
public abstract void setLocation(String location);
public abstract Collection getSalesReps();
public abstract void setSalesReps(Collection salesReps);
public String ejbCreate(String location)
throws CreateException {
setLocation(location);
return null;
}
public void ejbPostCreate(String location)
throws CreateException {}
public void ejbActivate() {}
public void ejbLoad() {}
public void ejbPassivate() {}
public void ejbRemove() {}
public void ejbStore() {}
public void setEntityContext(EntityContext ctx) {}
public void unsetEntityContext() {}
}
-----------------------------------------------------------SalesRepLocal.java
package examples.distributor;
import javax.ejb.EJBLocalObject;
public interface SalesRepLocal extends EJBLocalObject {
public String getRepName();
public double getSalesVolume();
public void setSalesVolume(double volume);
}
--------------------------------------------------------------------SalesRepLocalHome.java
package examples.distributor;
import javax.ejb.EJBLocalHome;
import javax.ejb.FinderException;
import javax.ejb.CreateException;
public interface SalesRepLocalHome extends EJBLocalHome {
public SalesRepLocal findByPrimaryKey(String name)
throws FinderException;
public SalesRepLocal create(String name, double volume)
throws CreateException;
}
----------------------------------------------------------------SalesRepBean.java
package examples.distributor;
import javax.ejb.EntityBean;
import javax.ejb.EntityContext;
import javax.ejb.CreateException;
public abstract class SalesRepBean implements EntityBean {
public abstract String getRepName();
public abstract void setRepName(String repName);
public abstract double getSalesVolume();
public abstract void setSalesVolume(double volume);
public String ejbCreate(String repName, double salesVolume)
throws CreateException {
setRepName(repName);
setSalesVolume(salesVolume);
return null;
}
public void ejbPostCreate(String repName, double salesVolume)
throws CreateException {}
public void ejbActivate() {}
public void ejbLoad() {}
public void ejbPassivate() {}
public void ejbRemove() {}
public void ejbStore() {}
public void setEntityContext(EntityContext ctx) {}
public void unsetEntityContext() {}
}
-------------------------------------------------ejb-jar.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE ejb-jar PUBLIC '-//Sun Microsystems, Inc.//DTD Enterprise JavaBeans 2.0//EN' 'http://java.sun.com/dtd/ejb-jar_2_0.dtd'>
<ejb-jar>
<display-name>distributor</display-name>
<enterprise-beans>
<display-name>DistributorEJB</display-name>
<ejb-name>DistributorEJB</ejb-name>
examples.distributor.DistributorHome
examples.distributor.Distributor
<ejb-class>examples.distributor.DistributorBean</ejb-class>
<persistence-type>Container</persistence-type>
<prim-key-class>java.lang.String</prim-key-class>
True
<cmp-version>2.x</cmp-version>
<abstract-schema-name>DistributorBean</abstract-schema-name>
<cmp-field>
<field-name>distributorName</field-name>
</cmp-field>
<primkey-field>distributorName</primkey-field>
<ejb-local-ref>
<ejb-ref-name>ejb/SalesOfficeEJB</ejb-ref-name>
<ejb-ref-type>Entity</ejb-ref-type>
<local-home>examples.distributor.SalesOfficeLocalHome</local-home>
examples.distributor.SalesOfficeLocal
<ejb-link>SalesOfficeEJB</ejb-link>
</ejb-local-ref>
<ejb-local-ref>
<ejb-ref-name>ejb/SalesRepEJB</ejb-ref-name>
<ejb-ref-type>Entity</ejb-ref-type>
<local-home>examples.distributor.SalesRepLocalHome</local-home>
examples.distributor.SalesRepLocal
<ejb-link>SalesRepEJB</ejb-link>
</ejb-local-ref>
<query-method>
<method-name>ejbSelectSalesOffice</method-name>
<method-params>
<method-param>java.lang.String</method-param>
<method-param>java.lang.String</method-param>
</method-params>
</query-method>
<result-type-mapping>Local</result-type-mapping>
<ejb-ql>SELECT OBJECT(so) FROM DistributorBean db, IN (db.offices) so WHERE db.distributorName = ?1 and so.location = ?2</ejb-ql>
<display-name>SalesOfficeEJB</display-name>
<ejb-name>SalesOfficeEJB</ejb-name>
<local-home>examples.distributor.SalesOfficeLocalHome</local-home>
examples.distributor.SalesOfficeLocal
<ejb-class>examples.distributor.SalesOfficeBean</ejb-class>
<persistence-type>Container</persistence-type>
<prim-key-class>java.lang.String</prim-key-class>
True
<cmp-version>2.x</cmp-version>
<abstract-schema-name>SalesOfficeBean</abstract-schema-name>
<cmp-field>
<field-name>location</field-name>
</cmp-field>
<primkey-field>location</primkey-field>
<display-name>SalesRepEJB</display-name>
<ejb-name>SalesRepEJB</ejb-name>
<local-home>examples.distributor.SalesRepLocalHome</local-home>
examples.distributor.SalesRepLocal
<ejb-class>examples.distributor.SalesRepBean</ejb-class>
<persistence-type>Container</persistence-type>
<prim-key-class>java.lang.String</prim-key-class>
True
<cmp-version>2.x</cmp-version>
<abstract-schema-name>SalesRepBean</abstract-schema-name>
<cmp-field>
<field-name>repName</field-name>
</cmp-field>
<cmp-field>
<field-name>salesVolume</field-name>
</cmp-field>
<primkey-field>repName</primkey-field>
</enterprise-beans>
<ejb-relation>
<ejb-relation-name>Distributer-SalesOffice</ejb-relation-name>
<ejb-relationship-role>
<ejb-relationship-role-name>DistributorEJB</ejb-relationship-role-name>
One
<relationship-role-source>
<ejb-name>DistributorEJB</ejb-name>
</relationship-role-source>
<cmr-field>
<cmr-field-name>offices</cmr-field-name>
<cmr-field-type>java.util.Collection</cmr-field-type>
</cmr-field>
</ejb-relationship-role>
<ejb-relationship-role>
<ejb-relationship-role-name>SalesOfficeEJB</ejb-relationship-role-name>
Many
<relationship-role-source>
<ejb-name>SalesOfficeEJB</ejb-name>
</relationship-role-source>
</ejb-relationship-role>
</ejb-relation>
<ejb-relation>
<ejb-relation-name>SalesOffice-SalesReps</ejb-relation-name>
<ejb-relationship-role>
<ejb-relationship-role-name>SalesOfficeEJB</ejb-relationship-role-name>
One
<relationship-role-source>
<ejb-name>SalesOfficeEJB</ejb-name>
</relationship-role-source>
<cmr-field>
<cmr-field-name>salesReps</cmr-field-name>
<cmr-field-type>java.util.Collection</cmr-field-type>
</cmr-field>
</ejb-relationship-role>
<ejb-relationship-role>
<ejb-relationship-role-name>SalesRepEJB</ejb-relationship-role-name>
Many
<relationship-role-source>
<ejb-name>SalesRepEJB</ejb-name>
</relationship-role-source>
</ejb-relationship-role>
</ejb-relation>
<assembly-descriptor>
<container-transaction>
<ejb-name>SalesRepEJB</ejb-name>
<method-name>*</method-name>
<trans-attribute>Required</trans-attribute>
</container-transaction>
<container-transaction>
<ejb-name>SalesOfficeEJB</ejb-name>
<method-name>*</method-name>
<trans-attribute>Required</trans-attribute>
</container-transaction>
<container-transaction>
<ejb-name>DistributorEJB</ejb-name>
<method-name>*</method-name>
<trans-attribute>Required</trans-attribute>
</container-transaction>
</assembly-descriptor>
</ejb-jar>
---------------------------------------------------------------jboss.xml
<?xml version="1.0" encoding="Cp1252"?>
<enterprise-beans>
<ejb-name>DistributorEJB</ejb-name>
<jndi-name>DistributorEJB</jndi-name>
<ejb-name>SalesOfficeEJB</ejb-name>
<local-jndi-name>ejb/SalesOfficeEJB</local-jndi-name>
<ejb-name>SalesRepEJB</ejb-name>
<local-jndi-name>ejb/SalesRepEJB</local-jndi-name>
</enterprise-beans>
-----------------------------------------------------------------jbosscmp-jdbc.xml
<?xml version="1.0" encoding="ISO-8859-1"?>
<jbosscmp-jdbc>
<enterprise-beans>
<ejb-name>DistributorEJB</ejb-name>
<table-name>DistributorBean</table-name>
<cmp-field>
<field-name>distributorName</field-name>
<column-name>distributorName</column-name>
</cmp-field>
<query-method>
<method-name>ejbSelectSalesOffice</method-name>
<method-params>
<method-param>java.lang.String</method-param>
<method-param>java.lang.String</method-param>
</method-params>
</query-method>
<ejb-name>SalesOfficeEJB</ejb-name>
<table-name>SalesOfficeBean</table-name>
<cmp-field>
<field-name>location</field-name>
<column-name>location</column-name>
</cmp-field>
<ejb-name>SalesRepEJB</ejb-name>
<table-name>SalesRepBean</table-name>
<cmp-field>
<field-name>repName</field-name>
<column-name>repName</column-name>
</cmp-field>
<cmp-field>
<field-name>salesVolume</field-name>
<column-name>salesVolume</column-name>
</cmp-field>
</enterprise-beans>
<ejb-relation>
<ejb-relation-name>Distributer-SalesOffice</ejb-relation-name>
<foreign-key-mapping>
<ejb-relationship-role>
<ejb-relationship-role-name>DistributorEJB</ejb-relationship-role-name>
<foreign-key-fields/>
</ejb-relationship-role>
<ejb-relationship-role>
<ejb-relationship-role-name>SalesOfficeEJB</ejb-relationship-role-name>
<foreign-key-fields>
<foreign-key-field>
<field-name>distributorName</field-name>
<column-name>distributorName</column-name>
</foreign-key-field>
</foreign-key-fields>
</ejb-relationship-role>
</foreign-key-mapping>
</ejb-relation>
<ejb-relation>
<ejb-relation-name>SalesOffice-SalesReps</ejb-relation-name>
<foreign-key-mapping>
<ejb-relationship-role>
<ejb-relationship-role-name>SalesOfficeEJB</ejb-relationship-role-name>
<foreign-key-fields/>
</ejb-relationship-role>
<ejb-relationship-role>
<ejb-relationship-role-name>SalesRepEJB</ejb-relationship-role-name>
<foreign-key-fields>
<foreign-key-field>
<field-name>location</field-name>
<column-name>location</column-name>
</foreign-key-field>
</foreign-key-fields>
</ejb-relationship-role>
</foreign-key-mapping>
</ejb-relation>
</jbosscmp-jdbc>