2011-03-24 3 views
0

테스트 서버에서 제대로 작동하지만 배포 할 때 제대로 작동하지 않는 DataNeucleus JDO 구현을 사용하고 있습니다. GAE에 익숙하지 않으며 모든 DataNeucleus 기능이 아닌 것을 알고 있습니다. 지원됩니다. 이 작업을 수행하는 방법을 모릅니다. 나는 클래스가Google App Engine이 클래스의 객체 목록을 저장하지 않습니다.

말 :

 

@PersistenceCapable 
public class MyInfoClass { 


    @PrimaryKey 
    @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY) 
    Key key; 

    @Persistent(mappedBy = "myInfoClass") 
    private List <BuddyData> buddyList; 

    ... 
} 



 

그리고 BuddyData

 

@PersistenceCapable 
public class BuddyData { 

... 
    @PrimaryKey 
    @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY) 
    Key key; 

    // the one-to-many rel to MyInfoClass -> BuddyData 
    @Persistent 
    private MyInfoClass myInfoClass; 

.... 

} 



 

내가 테스트 환경에서 작동하지만 애플 리케이션 엔진에 배포 할 때 작동하지 않는 등 그 이하 데이터 저장소에 데이터를 저장 .

 

     PersistenceManager pm = PMF.get().getPersistenceManager(); 
     Transaction tx = pm.currentTransaction(); 
     try { 
      tx.begin(); 
      //NOTE : myInfo is the persistent MyInfoClass object retrieved from the datastore 
      myInfo.getBuddyList().add(new BuddyData(email)); 
      tx.commit(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } finally { 
      if (tx.isActive()) { 
       tx.rollback(); 
      } 
      pm.close(); 
     } 

 

답변

1

소유 관계는 GAE에서 매우 까다로울 수 있습니다. 나는 그들과 몇 시간 싸우는 것을 기억한다.

우선, 소유 한 관계주기가 있습니다. GAE가이를 뒷받침하는지 의심 스럽습니다. 따라서 개체 중 하나를 Key을 사용하여 직접 개체 관계 (소유 관계) 대신 다른 개체를 참조하도록 변경해야합니다. 예를 들어

:

@PersistenceCapable 
public class BuddyData { 
    @PrimaryKey 
    @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY) 
    Key key; 

    // use Key instead of MyInfoClass 
    @Persistent 
    private Key myInfoClass; 
} 

둘째, BuddyData 목록은 PersistenceManager가 열려 있는지 확인 검색. 이처럼 그것을 할 경우

PersistenceManager pm = PMF.get().getPersistenceManager(); 
MyInfoClass info = pm.getObjectById(MyInfoClass.class, key); 
pm.close(); 
info.getBuddyList(); 

그런 다음 buddyList의 내용이 비어 있습니다.

getBuddyList() 이후에 pm.close()을 이동하거나 기본 가져 오기 그룹으로 설정해야합니다 (아래 참조). 잠재적 인 성능 비용으로 모든 콘텐츠를 열성적으로 미리 가져옵니다.

@Persistent(mappedBy = "myInfoClass", defaultFetchGroup = "true") 
private List <BuddyData> buddyList; 

행운을 빈다.

+0

감사합니다. 나는 이것을 줄 것이다. – Ramp

+0

DataInucleus가 클래스를 향상 시켰을 때 관계에서 MyInfoClass 대신 Key를 사용하면 오류가 발생했습니다. 그러나 트랜잭션 내에서 pm.makePersistent()를 호출하면 목록을 성공적으로 저장할 수있었습니다. 나는 어쨌든 당신의 대답을 받아들이고 있습니다 .- 감사합니다! – Ramp

관련 문제