This is a known issue. At present, you can't have both a one-to-one and one-to-many relationship of the same kind. - Jason
On Tue, Sep 15, 2009 at 2:57 PM, Tim <[email protected]> wrote: > > It appears that these two statements work individually but not > together. > > @Persistent > private ContactInfo manager; > @Persistent > private List<ContactInfo> staff = new ArrayList<ContactInfo>(); > > Change either @Persistent to @NotPersistent and the unit test > succeeds. > > > SDK: appengine-java-sdk-1.2.5 > > ****************** Stack Trace > *************************************************** > > java.lang.ClassCastException: oid is not instanceof > javax.jdo.identity.ObjectIdentity > at roster.ContactInfo.jdoCopyKeyFieldsFromObjectId(ContactInfo.java) > at > > org.datanucleus.store.mapped.mapping.PersistenceCapableMapping.setObjectAsValue > (PersistenceCapableMapping.java:657) > at > org.datanucleus.store.mapped.mapping.PersistenceCapableMapping.setObject > (PersistenceCapableMapping.java:364) > at org.datanucleus.store.appengine.DatastoreRelationFieldManager > $1.setObjectViaMapping(DatastoreRelationFieldManager.java:132) > at org.datanucleus.store.appengine.DatastoreRelationFieldManager > $1.apply(DatastoreRelationFieldManager.java:108) > at > > org.datanucleus.store.appengine.DatastoreRelationFieldManager.storeRelations > (DatastoreRelationFieldManager.java:80) > at > org.datanucleus.store.appengine.DatastoreFieldManager.storeRelations > (DatastoreFieldManager.java:795) > at > > org.datanucleus.store.appengine.DatastorePersistenceHandler.insertPostProcess > (DatastorePersistenceHandler.java:288) > at > org.datanucleus.store.appengine.DatastorePersistenceHandler.insertObjects > (DatastorePersistenceHandler.java:241) > at > org.datanucleus.store.appengine.DatastorePersistenceHandler.insertObject > (DatastorePersistenceHandler.java:225) > at org.datanucleus.state.JDOStateManagerImpl.internalMakePersistent > (JDOStateManagerImpl.java:3185) > at org.datanucleus.state.JDOStateManagerImpl.makePersistent > (JDOStateManagerImpl.java:3161) > at org.datanucleus.ObjectManagerImpl.persistObjectInternal > (ObjectManagerImpl.java:1298) > at org.datanucleus.ObjectManagerImpl.persistObject > (ObjectManagerImpl.java:1175) > at org.datanucleus.jdo.JDOPersistenceManager.jdoMakePersistent > (JDOPersistenceManager.java:669) > at org.datanucleus.jdo.JDOPersistenceManager.makePersistent > (JDOPersistenceManager.java:694) > at > testing.TestContactInfo.testTwoRelationShips(TestContactInfo.java: > 75) > at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) > at sun.reflect.NativeMethodAccessorImpl.invoke > (NativeMethodAccessorImpl.java:39) > at sun.reflect.DelegatingMethodAccessorImpl.invoke > (DelegatingMethodAccessorImpl.java:25) > at java.lang.reflect.Method.invoke(Method.java:597) > at junit.framework.TestCase.runTest(TestCase.java:164) > at junit.framework.TestCase.runBare(TestCase.java:130) > at junit.framework.TestResult$1.protect(TestResult.java:106) > at junit.framework.TestResult.runProtected(TestResult.java:124) > at junit.framework.TestResult.run(TestResult.java:109) > at junit.framework.TestCase.run(TestCase.java:120) > at > org.eclipse.jdt.internal.junit.runner.junit3.JUnit3TestReference.run > (JUnit3TestReference.java:130) > at org.eclipse.jdt.internal.junit.runner.TestExecution.run > (TestExecution.java:38) > at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests > (RemoteTestRunner.java:467) > at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests > (RemoteTestRunner.java:683) > at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run > (RemoteTestRunner.java:390) > at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main > (RemoteTestRunner.java:197) > *************************ContactInfo.java ************************* > import javax.jdo.annotations.IdGeneratorStrategy; > import javax.jdo.annotations.IdentityType; > import javax.jdo.annotations.PersistenceCapable; > import javax.jdo.annotations.Persistent; > import javax.jdo.annotations.PrimaryKey; > > import com.google.appengine.api.datastore.Key; > > @PersistenceCapable(identityType = IdentityType.APPLICATION) > public class ContactInfo { > > @PrimaryKey > @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY) > private Key contactInfoKey; > @Persistent > private String firstName; > @Persistent > private String lastName; > @Persistent > private String phoneNumber; > @Persistent > private String emailAddress; > public ContactInfo(String firstName, String lastName, String > phoneNumbers, > String emailAddresses) { > this.firstName = firstName; > this.lastName = lastName; > this.phoneNumber = phoneNumber; > this.emailAddress = emailAddress; > } > public String getFirstName() { > return firstName; > } > public void setFirstName(String firstName) { > this.firstName = firstName; > } > public String getLastName() { > return lastName; > } > public void setLastName(String lastName) { > this.lastName = lastName; > } > public String getPhoneNumber() { > return phoneNumber; > } > public void setPhoneNumber(String phoneNumber) { > this.phoneNumber = phoneNumber; > } > public Key getContactInfoId(){ > return contactInfoKey; > }} > ************************* Two Relationship > ******************************* > import java.util.ArrayList; > import java.util.List; > > import javax.jdo.annotations.IdGeneratorStrategy; > import javax.jdo.annotations.IdentityType; > import javax.jdo.annotations.NotPersistent; > import javax.jdo.annotations.PersistenceCapable; > import javax.jdo.annotations.Persistent; > import javax.jdo.annotations.PrimaryKey; > > @PersistenceCapable(identityType = IdentityType.APPLICATION) > public class TwoRelationship { > @PrimaryKey > @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY) > private Long id; > > > @Persistent > private ContactInfo manager; > @Persistent > private List<ContactInfo> staff = new ArrayList<ContactInfo>(); > public ContactInfo getManager() { > return manager; > } > public void setManager(ContactInfo manager) { > this.manager = manager; > } > public List<ContactInfo> getStaff() { > return staff; > } > public void setStaff(List<ContactInfo> staff) { > this.staff = staff; > } > > } > ************************PMF.java *************************** > import javax.jdo.JDOHelper; > import javax.jdo.PersistenceManagerFactory; > > public class PMF { > private static final PersistenceManagerFactory pmfInstance = > JDOHelper.getPersistenceManagerFactory("transactions- > optional"); > > private PMF() {} > > public static PersistenceManagerFactory get() { > return pmfInstance; > } > } > > > ************************** unit test ************************** > public void testTwoRelationShips(){ > > ContactInfo boss = new ContactInfo("Walt","Disney", "", ""); > ContactInfo worker = new ContactInfo("Mickey","Mouse", "", > ""); > > TwoRelationship tester = new TwoRelationship(); > tester.setManager(boss); > tester.getStaff().add(worker); > > PersistenceManager pm = PMF.get().getPersistenceManager(); > try { > pm.makePersistent(tester); > > }catch(Exception e){ > e.printStackTrace(); > } > finally { > pm.close(); > } > } > > > --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Google App Engine for Java" group. To post to this group, send email to [email protected] To unsubscribe from this group, send email to [email protected] For more options, visit this group at http://groups.google.com/group/google-appengine-java?hl=en -~----------~----~----~----~------~----~------~--~---
