I noticed that you're missing the <abstract-schema-name> element in the <entity> block. That might not be your problem, though; when I comment mine out I can still successfully deploy my solution. If adding <abstract-schema-name> does nothing, I'll look again. I haven't been using dependent objects because I couldn't figure out from the spec how to use a compound primary key defined by two CMR fields. The spec (in italics at the bottom of pg 121 of pd2) says this is possible, but I can't quite seem to figure out how it should work. Has anyone done this? Section 9.4.4.1 (at the end of pg 118) is confusing. It says that the primary key must be set by the end of ejbCreate(), but that CMR fields must not be modified until ejbPostCreate(). If a CMR field is the primary key, we seem to have a catch-22 problem... Jeff Schnitzer [EMAIL PROTECTED] > -----Original Message----- > From: Jim Archer [mailto:[EMAIL PROTECTED]] > Sent: Saturday, October 21, 2000 9:14 PM > To: Orion-Interest > Subject: EJB 2.0 Dependent Object problem - NPE on deploy > > > Hi All... > > After being told that Orion supports the PD1 spec for EJB 2.0 > dependent > objects I went through the PD1 spec carefully and compared it > to the PD2 > spec and changed my code accordingly. In fact, I have created a very > stripped down example that fails. I also have looked carefully at the > LogEntry class in the ATM example and its associated > deployment descriptors > and AccountEJB class. The best I can get Orion to do is throw a null > pointer exception (pasted below) at deployment time. I have > been trying a > variety of things for many hours so far Friday and this > weekend and still > just the same, cryptic null pointer error. > > I have posted the code and deployment descriptors below. I > realize the > error is mine, since I can successfully deploy the ATM example. > > If someone could take a look and let me know what I screwed > up, I would be > greatly appreciative. This whole mess is pretty > straightforward. In the > PersonEJB class you'll see I used AddrDo for the varible name as in > getAddrDo(), but I also tried to use a different name than > the type, sich > as getAddress(). If I remove the dependent object portions of > this code and > descriptor it works fine, except of course without the dependent. > > Also, there is a servlet and web descriptors and application > descriptors I > didn't post to save bandwidth. If thats needed I'll gladly post it. > > Thanks to everyone in advance. I'm sorry I'm asking so much, > but the side > of my head is bashed in from the brick wall. > > Jim > > > C:\orion>java -jar orion.jar > Auto-unpacking > C:\Orion-test-apps\Test20CmpDo\rel\Sample20EbDo-ver001a.ear... do > ne. > Auto-unpacking > C:\Orion-test-apps\Test20CmpDo\rel\Sample20EbDo-ver001a\Sample20E > bDo-ver001a-web.war... done. > Auto-deploying Sample20EbDo (Assembly had been updated)... > Auto-deploying Sample20EbDo-ver001a-ejb.jar (ejb-jar.xml had > been touched > since > the previous deployment)... java.lang.NullPointerException > at > com.evermind.server.ejb.deployment.ContainerManagedField.equals(JAX) > at java.util.HashMap.put(Unknown Source) > at java.util.HashSet.add(Unknown Source) > at java.util.AbstractCollection.addAll(Unknown Source) > at java.util.HashSet.<init>(Unknown Source) > at com.evermind.server.ejb.deployment.Dependent.zk(JAX) > at com.evermind.server.ejb.compilation.f4.<init>(JAX) > at com.evermind.server.ejb.compilation.f9.ss(JAX) > at com.evermind.server.ejb.EJBContainer.by(JAX) > at com.evermind.server.Application.by(JAX) > at com.evermind.server.Application.ge(JAX) > at com.evermind.server.ApplicationServer.rn(JAX) > at com.evermind.server.ApplicationServer.apr(JAX) > at com.evermind.server.ApplicationServer.ge(JAX) > at com.evermind.server.hf.run(JAX) > at java.lang.Thread.run(Unknown Source) > at com.evermind.util.f.run(JAX) > > > > > > <?xml version="1.0"?> > <!DOCTYPE ejb-jar PUBLIC "-//Sun Microsystems, Inc.//DTD Enterprise > JavaBeans 2.0//EN" "http://java.sun.com/j2ee/dtds/ejb-jar_2_0.dtd"> > <ejb-jar> > <description>Test Sample EJB 2.0 EB</description> > <display-name>Person</display-name> > <enterprise-beans> > <entity> > <cmp-version>2.0</cmp-version> > <description>Person has an address > DO</description> > > <display-name>Test20CmpDo.eb.Person</display-name> > <ejb-name>Test20CmpDo.eb.Person</ejb-name> > <home>Test20CmpDo.eb.PersonHome</home> > <remote>Test20CmpDo.eb.Person</remote> > <ejb-class>Test20CmpDo.eb.PersonEJB</ejb-class> > <persistence-type>Container</persistence-type> > > <prim-key-class>java.lang.String</prim-key-class> > <reentrant>True</reentrant> > > <!-- Same failure with & without the > next line --> > > <cmp-field><field-name>addrDo</field-name></cmp-field> > > > <cmp-field><field-name>userId</field-name></cmp-field> > > <cmp-field><field-name>firstName</field-name></cmp-field> > > <cmp-field><field-name>lastName</field-name></cmp-field> > > <primkey-field>userId</primkey-field> > </entity> > </enterprise-beans> > > <dependents> > <dependent> > <dependent-name>addrDo</dependent-name> > > <dependent-class>Test20CmpDo.eb.AddrDo</dependent-class> > <cmp-field>street</cmp-field> > <cmp-field>city</cmp-field> > <cmp-field>state</cmp-field> > <cmp-field>zip</cmp-field> > </dependent> > </dependents> > > <relationships> > <ejb-relation> > > <ejb-relation-name>User-Address</ejb-relation-name> > > <ejb-relationship-role> > > > <ejb-relationship-role-name>User-has-Address</ejb-relationship > -role-name> > <multiplicity>one</multiplicity> > > <role-source><ejb-name>Test20CmpDo.eb.PersonEJB</ejb-name></ro > le-source> > <cmr-field> > > <cmr-field-name>addrDo</cmr-field-name> > > <cmr-field-type>Test20CmpDo.eb.AddrDo</cmr-field-type> > </cmr-field> > </ejb-relationship-role> > > <ejb-relationship-role> > > > <ejb-relationship-role-name>Address-belongsto-User</ejb-relati > onship-role- > name> > <multiplicity>one</multiplicity> > > <role-source><dependent-name>addrDo</dependent-name></role-source> > </ejb-relationship-role> > </ejb-relation> > </relationships> > > <assembly-descriptor> > <security-role> > <description>Users</description> > <role-name>users</role-name> > </security-role> > </assembly-descriptor> > </ejb-jar> > > //------------------------------------------------------------------- > // AddrDo.java > package Test20CmpDo.eb; > > import java.io.*; > > // Make this Serializable because the example does. We > // get the same failure with or without it. > public abstract class AddrDo implements Serializable { > > // Required by PD1 but not PD2 > public abstract AddrDo deepCopy(); > > > // > --------------------------------------------------------------- > // Public accessor/setters here > // > --------------------------------------------------------------- > public abstract void setStreet(String sa); > public abstract String getStreet(); > > public abstract void setCity(String city); > public abstract String getCity(); > > public abstract void setState(String state); > public abstract String getState(); > > public abstract void setZip(String zip); > public abstract String getZip(); > } > > //------------------------------------------------------------------- > // Person.java > package Test20CmpDo.eb; > > import java.rmi.RemoteException; > import javax.ejb.EJBObject; > > > public interface Person extends EJBObject { > > // This field will be the primary key field > public String getUserId() throws RemoteException; > public void setUserId(String id) throws RemoteException; > > public String getLastName() throws RemoteException; > public void setLastName(String ln) throws RemoteException; > > public String getFirstName() throws RemoteException; > public void setFirstName(String fn) throws RemoteException; > } > > > //------------------------------------------------------------------- > // PersonEJB.java > package Test20CmpDo.eb; > > import java.rmi.RemoteException; > > import java.sql.*; > import java.util.Enumeration; > import java.util.Vector; > import java.util.Date; > > import javax.ejb.*; > import javax.naming.*; > import javax.sql.DataSource; > import javax.transaction.*; > > public abstract class PersonEJB implements EntityBean { > > protected EntityContext ejbContext; > > public void setEntityContext(EntityContext ctx) { > ejbContext = ctx; > } > > public void unsetEntityContext() { > ejbContext = null; > } > > public void ejbRemove() throws RemoveException { > } > > public void ejbLoad() { > } > > public void ejbStore() { > } > > public void ejbPostCreate() throws CreateException { > } > > // ------------------------------------------------------------ > public String ejbCreate() { > trace("ejbCreate() entered"); > > initToNull(); > > setUserId("jarcher"); > setFirstName("Jim"); > setLastName("Archer"); > > addAddress(); > > trace("ejbCreate() exiting"); > > // In CMP, should return null. > return null; > } > > // ------------------------------------------------------------ > public void ejbPassivate() {} > public void ejbActivate() {} > > // ------------------------------------------------------------ > private void initToNull() > { > trace("initToNull() entered"); > > setUserId(null); > setFirstName(null); > setLastName(null); > > trace("initToNull() exiting"); > } > > // --------------------------------------------------------- > private void trace(String text) > { > java.util.Date now = new java.util.Date(); > System.out.println("PersonEJB: " + now + " " + text); > } > > > // Create, get & set methods for our Address dependent object > public abstract AddrDo createAddrDo(); > public abstract AddrDo getAddrDo(); > public abstract void setAddrDo(AddrDo addrDo); > > > // User Methods ------------------------------------------- > public abstract String getUserId(); > public abstract void setUserId(String id); > > public abstract String getFirstName(); > public abstract void setFirstName(String fn); > > public abstract String getLastName(); > public abstract void setLastName(String ln); > > public void addAddress() > { > AddrDo newAddr = createAddrDo(); > newAddr.setStreet("10 Crestview Drive"); > newAddr.setCity("Greenville"); > newAddr.setState("RI"); > newAddr.setZip("02828"); > > setAddrDo(newAddr); > } > } > > //------------------------------------------------------------------- > // PersonHome.java > package Test20CmpDo.eb; > > import java.rmi.RemoteException; > import java.util.*; > import javax.ejb.CreateException; > import javax.ejb.EJBHome; > import javax.ejb.FinderException; > > > public interface PersonHome extends EJBHome { > Person create() > throws CreateException, RemoteException; > > Person findByPrimaryKey(String userId) > throws FinderException, RemoteException; > > /* > Collection findByLastname(String lastname) > throws FinderException, RemoteException; > > Collection findByFullName(String lastname, String firstname) > throws FinderException, RemoteException; > > Collection findAll() > throws FinderException, RemoteException; > */ > } > > > > > > > >
