2009-06-28 13 views
5

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) 
+1

Können Sie versuchen, die PK in Mitarbeiter von Long zu Key – jitter

Antwort

3

Ich glaube nicht, Sie falsch etwas zu tun sind. Dies scheint ein Fehler mit dem Herstellercode zu sein. siehe this link. es gibt nicht eine ganze Menge von Informationen, aber sie intime, dass die PK auf Ihrem Typ Employee.id ist problematisch.

+0

süß zu ändern. Ich muss anfangen, die Datanucleus-Gruppen sowie die App-Engine-Gruppen zu durchsuchen, wenn ich ein Problem habe. –

+0

google sollte tun, da es diese Quellen sowie SO aufbringen wird. – akf

0

Die ID-Spalte Ihrer Datenbank ist nicht mit Long kompatibel. Ich glaube nicht, dass dies etwas mit dem Eltern/Kind-Mapping zu tun hat. Wenn Sie dies bestätigen möchten, teilen Sie Ihre create-Anweisungen bitte mit.

+0

Ich benutze googles App-Engine als Backend, also gibt es keine create-Anweisungen. Außerdem werden beide Entitäten im Datenspeicher gespeichert, wenn ich makePersistent nach dem Hinzufügen des untergeordneten Elements ausführen. –

0

Ich bin sicher, dass Sie diesen Code auf Ihrem lokalen Computer versuchen. Vielleicht ist dies ein Fehler mit dem Eclipse-Plugin von GAE, denn wenn Sie versuchen, dies bei der Produktion auszuführen, wird es gut laufen. Ich denke, die lokale Version der App Engine gibt nur String und nicht für eine Key, oder ist es umgekehrt? Was auch immer der Fall sein sollte, sollte es auf Produktion laufen.

Verwandte Themen