2009-06-28 14 views
5

Necesito ayuda para entender qué estoy haciendo mal aquí. Estoy intentando para dominar relaciones de una a varias y ejecutar en una barricada. Me trataron de modificar el Empleado y el ejemplo ContactInfo hacer uno a muchas asignaciones:ClassCastException al intentar agregar hijo a padre en el propietario de uno para muchos. (usando jdo en google appengine)

todo funciona si creo tanto para el padre (empleado) y el niño (Contacto) y luego llamar makePersistent. Pero si trato de agregar un objeto secundario a un elemento primario ya persistente, I obtiene una excepción java.lang.ClassCast. El seguimiento de pila completo se encuentra en la parte inferior de la publicación .

Este es el código que rompe (Si muevo la llamada makePersistent() para después de que el add(), todo funciona bien:

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 
} 

Aquí es la clase padre

@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; 
} 

} 

Aquí está la clase infantil

@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; 
} 

} 

Aquí está la pila completa:

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

Puede intentar cambiar el PK en Empleado de largo a clave – jitter

Respuesta

3

No creo que está haciendo nada malo. esto parece ser un error con el código del proveedor. ver this link. no hay mucha información, pero indican que el PK en su tipo Long Employee.id es problemático.

+0

dulce. Tendré que comenzar a buscar en los grupos de datanucleus y en los grupos de motores de la aplicación cuando tenga un problema. –

+0

google debería hacer, ya que mostrará esas fuentes, así como SO. – akf

0

La columna de id de su base de datos no es compatible con Long. No creo que esto tenga nada que ver con el mapeo de padres/hijos. Si desea confirmar, por favor comparta sus declaraciones de creación.

+0

Estoy utilizando el motor de aplicaciones de Google como el back-end para que no haya instrucciones de creación. Además, ambas entidades se guardan en el almacén de datos si hago el makePersistent después de agregar el elemento secundario. –

0

Estoy seguro de que está intentando este código en su máquina local. Tal vez esto es un error con el plugin Eclipse de GAE, porque, cuando intentes ejecutar esto en producción, funcionará bien. Creo que la versión local de App Engine solo devuelve String y no Long para un Key, ¿o es al revés? Cualquiera que sea el caso, debería ejecutarse en producción.

Cuestiones relacionadas