Ich brauche Hilfe, herauszufinden, was ich hier falsch mache. Ich versuche , um eine zu vielen Beziehungen zu meistern und in einen Straßenblock zu laufen. Ich versuchte, die Mitarbeiter und Contact Beispiel zu modifizieren, ein bis viele Zuordnungen zu tun:ClassCastException, wenn versucht wird, ein untergeordnetes Element dem übergeordneten Element hinzuzufügen. (mit jdo auf Google Appengine)
Alles funktioniert, wenn ich sowohl die Eltern (Mitarbeiter) und Kind schaffen (Kontakt) und dann makePersistent nennen. Wenn ich jedoch versuche, ein untergeordnetes Objekt zu einem bereits persistenten Elternobjekt hinzuzufügen, erhalte ich eine java.lang.ClassCast-Ausnahme. Der vollständige Stack-Trace befindet sich unter der Unterseite des Posts.
Hier ist der Code, der bricht (Wenn ich die makePersistent() Aufruf nach der add() bewegen, funktioniert alles einwandfrei:
public void testOneToMany(){
pm = newPM();
Employee e = new Employee("peter");
pm.makePersistent(e);
Contact c = new Contact("123 main");
List<Contact> contacts = e.getContacts();
contacts.add(c); // here I get java.lang.ClassCastException: java.lang.Long cannot be cast to java.lang.String
}
Hier ist die Klasse Elternteil
@PersistenceCapable(identityType = IdentityType.APPLICATION)
public class Employee {
@PrimaryKey
@Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
private Long id;
@Persistent
private String name;
@Persistent(mappedBy="employee")
private List<Contact> contacts;
public Employee(String e){
contacts = new ArrayList<Contact>();
name = e;
}
List<Contact> getContacts(){
return contacts;
}
Long getId(){
return id;
}
public String getName(){
return name;
}
}
Hier ist die Kindklasse
@PersistenceCapable(identityType = IdentityType.APPLICATION)
public class Contact {
@PrimaryKey
@Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
private Key key;
@Persistent
private String streetAddress;
@Persistent
private Employee employee;
public Contact(String s){
streetAddress = s;
}
public String getAddress(){
return streetAddress;
}
public Employee getEmployee(){
return employee;
}
}
Hier ist der volle Stacktrace:
java.lang.ClassCastException: java.lang.Long cannot be cast to
java.lang.String
at org.datanucleus.store.appengine.DatastoreRelationFieldManager
$1.setObjectViaMapping(DatastoreRelationFieldManager.java:148)
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:770)
at
org.datanucleus.store.appengine.DatastorePersistenceHandler.insertObject
(DatastorePersistenceHandler.java:231)
at org.datanucleus.state.JDOStateManagerImpl.internalMakePersistent
(JDOStateManagerImpl.java:3067)
at org.datanucleus.state.JDOStateManagerImpl.makePersistent
(JDOStateManagerImpl.java:3043)
at org.datanucleus.ObjectManagerImpl.persistObjectInternal
(ObjectManagerImpl.java:1258)
at org.datanucleus.sco.SCOUtils.validateObjectForWriting
(SCOUtils.java:1365)
at
org.datanucleus.store.mapped.scostore.ElementContainerStore.validateElementForWriting
(ElementContainerStore.java:401)
at
org.datanucleus.store.mapped.scostore.FKListStore.validateElementForWriting
(FKListStore.java:764)
at org.datanucleus.store.mapped.scostore.FKListStore.internalAdd
(FKListStore.java:503)
at org.datanucleus.store.mapped.scostore.AbstractListStore.add
(AbstractListStore.java:123)
at org.datanucleus.sco.backed.List.add(List.java:752)
at com.btg.plyus.scratch.JDOTest.testOneToMany(JDOTest.java:33)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at junit.framework.TestCase.runTest(TestCase.java:168)
at com.btg.plyus.test.BaseTest.runTest(BaseTest.java:79)
at junit.framework.TestCase.runBare(TestCase.java:134)
at junit.framework.TestResult$1.protect(TestResult.java:110)
at junit.framework.TestResult.runProtected(TestResult.java:128)
at junit.framework.TestResult.run(TestResult.java:113)
at junit.framework.TestCase.run(TestCase.java:124)
at junit.framework.TestSuite.runTest(TestSuite.java:232)
at junit.framework.TestSuite.run(TestSuite.java:227)
at org.junit.internal.runners.OldTestClassRunner.run
(OldTestClassRunner.java:76)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run
(JUnit4TestReference.java:45)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run
(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests
(RemoteTestRunner.java:460)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests
(RemoteTestRunner.java:673)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run
(RemoteTestRunner.java:386)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main
(RemoteTestRunner.java:196)
Können Sie versuchen, die PK in Mitarbeiter von Long zu Key – jitter