Jason, is it also true that you can't have two one-to-one
relationships of the same kind?  I'm able to save such a relationship,
but when I fetch it, I get the same child in both values.  I need to
debug further (would not be surprised if it's just something I'm doing
wrong), but wondering if it's just a known issue.

On Sep 17, 4:12 pm, "Jason (Google)" <[email protected]> wrote:
> 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
-~----------~----~----~----~------~----~------~--~---

Reply via email to