ClassCastException при попытке добавить дочерний элемент к родительскому, принадлежащий одному ко многим.(используя jdo в Google Appengine)

StackOverflow https://stackoverflow.com/questions/1055982

Вопрос

Мне нужна помощь, чтобы понять, что я здесь делаю не так.Я пытаюсь овладеть одним ко многим отношениям и столкнуться с препятствием.Я попытался изменить пример сотрудника и связаться с примером, чтобы сделать один ко многим сопоставлениям:

Все работает, если я создаю как родителя (сотрудника), так и ребенка (контакт), а затем вызовут MakePersistent.Но если я попытаюсь добавить детского объекта к уже постоянному родителю, я получаю исключение java.lang.classcast.Полный след стека находится в нижней части поста.

Вот код, который ломается (если я перемещаю вызов MakePersistent () после add (), все работает нормально:

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
}

Вот родительский класс

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

}

Вот дочерний класс

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

}

Вот полная трассировка стека:

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) 
Это было полезно?

Решение

я не думаю ты делают что-то неправильно.похоже, это ошибка в коде поставщика.видеть эта ссылка.информации не так много, но намекают, что ПК вашего типа Long Сотрудник.id является проблематичным.

Другие советы

Столбец идентификатора вашей базы данных несовместим с Long.Я не думаю, что это имеет какое-либо отношение к сопоставлению родительских и дочерних элементов.Если вы хотите подтвердить, поделитесь своими утверждениями о создании.

Я уверен, что вы пробуете этот код на своем локальном компьютере.Возможно, это ошибка плагина GAE Eclipse, потому что, когда вы попытаетесь запустить его в рабочей среде, он будет работать нормально.Я думаю, что локальная версия App Engine возвращает только String и не Long для Key, Или это наоборот?В любом случае, он должен работать на производстве.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top