2009-06-28 1 views
5

私がここで間違っていることを理解する助けが必要です。私は を試して、1対多の関係をマスターし、ロードブロッキングを実行しています。 私は1つ に多くのマッピングを行うために従業員とのContactInfoの例を修正しようとしました:私は親(従業員)と子 (連絡先)の両方を作成し、次にてmakePersistentを呼び出す場合ClassCastException親を所有する1対多の子に追加するとき。 (Google App Engineでjdoを使用)

すべてが動作します。 しかし、すでに永続的な親に子オブジェクトを追加しようとすると、 は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) 
+1

従業員のPKをLongからKeyに変更することはできますか? – jitter

答えて

3

私はあなたは何も悪いことをしていると思ういけません。これはベンダーコードのバグであるようです。 this linkを参照してください。多くの情報はありませんが、あなたのタイプのPK Long Employee.idが問題であることは親密です。

+0

sweet。私は問題があるときに、datanucleusグループとappエンジングループの検索を開始する必要があります。 –

+0

googleがそうするべきである。 – akf

0

データベースのID列はLongと互換性がありません。私はこれが親子マッピングとは関係がないと考えています。確認したい場合は、作成ステートメントを共有してください。

+0

Googleのアプリエンジンをバックエンドとして使用しているため、作成ステートメントはありません。また、子を追加した後にmakePersistentを実行すると、両方のエンティティがデータストアに保存されます。 –

0

あなたのローカルマシンでこのコードを試していますか?おそらくこれはGAEのEclipseプラグインのバグです。これを実稼働環境で実行しようとするとうまく動作するからです。 App EngineのローカルバージョンはStringしか返さず、Keyの場合はLongではないと思いますか、それとも逆ですか?どのような場合でも、それは実稼働環境で実行する必要があります。

関連する問題