2009-06-28 1 views
5

내가 여기서 잘못하고있는 것을 알아내는 데 도움이 필요합니다. 을 사용하여 1 대 다수 관계를 마스터하고로드 블록을 실행하고 있습니다. 나는 부모 (직원)와 자식 (연락)을 모두 만들 경우ClassCastException - 소유 된 일대 다에서 상위에 하위를 추가하려고 할 때. (Google App Engine에서 jdo 사용)

모든 것이 작동하고 makePersistent 전화 : 나는 하나 많은 매핑을 수행 할 직원 및 CONTACTINFO 예를 수정했습니다. 그러나 자식 개체를 이미 영구적 인 부모 개체에 추가하려고하면 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) 
+1

직원의 PK를 긴 키에서 – jitter

답변

3

난 당신이 뭔가 잘못을하고 것 같아요. 이것은 공급 업체 코드의 버그 인 것 같습니다. this link을 참조하십시오. 정보가 전부는 아니지만, Long Employee.id 유형의 PK가 문제가 있다는 것을 알고 있습니다.

+0

sweet로 변경할 수 있습니까? 나는 문제가있을 때 datanucleus 그룹뿐만 아니라 app 엔진 그룹을 검색해야 할 것입니다. –

+0

google은 그렇게 할뿐만 아니라 그 소스를 가져올 것입니다. – akf

0

데이터베이스의 ID 열은 Long과 호환되지 않습니다. 나는 이것이 부모/자식 매핑과 관련이 없다고 생각한다. 확인하고 싶다면 create 문을 공유하십시오.

+0

Google의 app-engine을 백엔드로 사용하고 있으므로 작성 문이 없습니다. 또한 자식을 추가 한 후에 makePersistent를 수행하면 두 엔티티가 모두 데이터 저장소에 저장됩니다. –

0

로컬 컴퓨터에서이 코드를 사용하려고합니다. 어쩌면 GAE의 이클립스 플러그인 버그 일 수 있습니다. 프로덕션 환경에서이 플러그인을 실행하려고하면 잘 돌아갑니다. 로컬 버전의 App Engine은 String 만 반환하고 KeyLong이 아니라고 생각합니까? 아니면 그 반대입니까? 어떤 경우이든, 그것은 생산 단계에서 실행되어야합니다.

관련 문제