ClassCastExceptionが多くを所有しているいずれかの親に子を追加しようとしたとき。 (Googleの有力候補にJDOを使用して)
-
20-08-2019 - |
質問
私は私がここで間違ってやっている考え出すいくつかの助けを必要としています。やっています バリケードに多くの関係やランニングに1を習得します。 私は1つを行うために従業員との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)
解決
他のヒント
あなたのデータベースのid列が長いと互換性がありません。私は、これは、親/子のマッピングを行うには何も持っていないと思います。あなたが確認したい場合は、あなたの作成文を共有してください。
私はあなたのローカルマシン上でこのコードをしようとしていることを確認しています。本番でこれを実行しようとすると、それがうまく実行される、ので、多分これは、GAEのEclipseプラグインのバグです。私は、App EngineののローカルバージョンのみString
を返し、Long
ためKey
ない、またはそれは他の方法で回避だと思いますか?場合が何であれ、それは生産上で実行する必要があります。
所属していません StackOverflow