2011-03-24 63 views
0

我正在使用DataNeucleus JDO實現,它在我的測試服務器上正常工作,但部署時效果不佳。我是GAE的新手,我知道並非所有DataNeucleus特性被支持。不知道如何使這項工作。谷歌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 2011-03-24 17:48:39

+0

使用Key而不是MyInfoClass在關係中引起錯誤時,Datanucleus增強了該類。但是,在事務中調用pm.makePersistent()幫助成功保存列表。無論如何,我都會接受你的答案,謝謝! – Ramp 2011-03-30 02:46:03