ClassCastException عند محاولة إضافة الطفل إلى الأم في واحد المملوكة للكثيرين. (باستخدام JDO على جوجل إلى AppEngine)

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

سؤال

وانا بحاجة الى بعض المساعدة في معرفة ما أفعله خطأ هنا. أحاول لإتقان احد إلى العديد من العلاقات والوقوع في حاجز. حاولت تعديل المثال موظف و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، أم أنه على العكس من ذلك؟ أيا كان الحال، يجب أن تعمل على الإنتاج.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top