ClassCastException عند محاولة إضافة الطفل إلى الأم في واحد المملوكة للكثيرين. (باستخدام JDO على جوجل إلى AppEngine)
-
20-08-2019 - |
سؤال
وانا بحاجة الى بعض المساعدة في معرفة ما أفعله خطأ هنا. أحاول لإتقان احد إلى العديد من العلاقات والوقوع في حاجز. حاولت تعديل المثال موظف وContactInfo لفعل واحد ل العديد من تعيينات:
وتعمل كل شيء إذا أنا خلق كل من الأم (الموظف) والطفل (الاتصال) ومن ثم استدعاء makePersistent. ولكن إذا كنت في محاولة لإضافة كائن تابع لأحد الوالدين المستمرة بالفعل، I الحصول على استثناء java.lang.ClassCast. تتبع المكدس الكامل في أسفل المشاركة.
وهنا هو رمز أن يكسر (إذا أنا تحريك makePersistent () الدعوة إلى بعد الاعلان ()، كل شيء يعمل على ما يرام:
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)
المحلول
لا أعتقد أن <م> أنت م> يفعلون أي شيء خطأ. يبدو أن هذا الخلل مع رمز بائع. يمكنك الاطلاع على هذا الرابط . هناك is not مجموعة كبيرة من المعلومات، لكنها الحميمة أن PK على نوع Long
Employee.id إشكالية.
نصائح أخرى
وعمود معرف قاعدة البيانات الخاصة بك ليست متوافقة مع طويل. أنا لا أعتقد أن هذا له علاقة مع تعيين الأم / الطفل. إذا كنت تريد التأكيد، يرجى نشاطركم إنشاء عبارات.
وأنا متأكد من أنك تحاول هذه الشفرة على الجهاز المحلي. ربما هذا خطأ مع البرنامج المساعد الكسوف GAE، لأن، عند محاولة تشغيل هذا على الإنتاج، فستعمل على ما يرام. أعتقد أن نسخة محلية من محرك التطبيقات بإرجاع String
فقط وليس Long
لKey
، أم أنه على العكس من ذلك؟ أيا كان الحال، يجب أن تعمل على الإنتاج.