2010-07-20 234 views
0

如何存儲複雜的對象?在調用makePersistent(person)對象時,在子對象的子對象列表中有一個對象有四個子對象列表。幫幫我!!!!!!!!!!!!Google App Engine JDO問題

我打電話給pm.makePersistent();但列表

@Persistent 
    private List<ChoosedElementEntity> choosedElements = new ArrayList<ChoosedElementEntity>(); 

    @Persistent 
    private List<PleasantElementEntity> pleasantElements = new ArrayList<PleasantElementEntity>(); 

    @Persistent 
    private List<UnpleasantElementEntity> unpleasantElements = new ArrayList<UnpleasantElementEntity>(); 

    @Persistent 
    private List<SetViewElementEntity> setViewElements = new ArrayList<SetViewElementEntity>(); 

未保存!!!

例如:

@PersistenceCapable(table = "persons", identityType = IdentityType.APPLICATION) 
public class PersonEntity { 
    @PrimaryKey 
    @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY) 
    private Long id; 

    @Persistent 
    private List<OfferEntity> offers = new ArrayList<OfferEntity>(); 
} 

@PersistenceCapable(table = "offers", identityType = IdentityType.APPLICATION) 
public class OfferEntity { 
    @PrimaryKey 
    @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY) 
    private Key id; 


    @Persistent 
    private List<ChoosedElementEntity> choosedElements = new ArrayList<ChoosedElementEntity>(); 

    @Persistent 
    private List<PleasantElementEntity> pleasantElements = new ArrayList<PleasantElementEntity>(); 

    @Persistent 
    private List<UnpleasantElementEntity> unpleasantElements = new ArrayList<UnpleasantElementEntity>(); 

    @Persistent 
    private List<SetViewElementEntity> setViewElements = new ArrayList<SetViewElementEntity>(); 
} 


@PersistenceCapable(table = "offer_selections", identityType = IdentityType.APPLICATION) 
public class ChoosedElementEntity { 
    @PrimaryKey 
    @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY) 
    private Key id; 

    @Persistent 
    private String code; 

    @Persistent 
    private Text cmComments; 
} 

@PersistenceCapable(table = "offer_selections", identityType = IdentityType.APPLICATION) 
public class PleasantElementEntity { 
    @PrimaryKey 
    @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY) 
    private Key id; 

    @Persistent 
    private String code; 

    @Persistent 
    private Text cmComments; 
} 

@PersistenceCapable(table = "offer_selections", identityType = IdentityType.APPLICATION) 
public class UnpleasantElementEntity { 
    @PrimaryKey 
    @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY) 
    private Key id; 

    @Persistent 
    private String code; 

    @Persistent 
    private Text cmComments; 
} 
+0

請閱讀我的回答,您的註釋顯然不正確,正如Google文檔中所述。 – corydoras 2010-07-21 00:45:34

+0

請告訴我如何正確! – Artem 2010-07-21 05:01:32

回答

2
  • 檢查你聲明的所有對象層次中的類如@PersistenceCapable
  • 檢查你聲明的列表/設置對象變量爲每google documentation?即:
     
    @Element(dependent = "true") 
    private Set tags = new HashSet(); 
    
  • 您是否嘗試過使用makePersistentAll(person)
  • 檢查您的數據是否真的被保存查看您的數據http://localhost:8888/_ah/admin/
  • 您是否關閉持久性處理程序?即pm.close()。數據永遠不會持續,直至關閉處理程序,即:
     
    // All objects are manupliated using a pm object 
    PersitenceManager pm = PMF.instance().getPersistenceManager(); 
    // do work 
    // Store the changes 
    pm.close() 
    
+1

爲什麼@Element(dependent =「true」)? – Artem 2010-07-20 09:40:46

+0

strust object - > class person {list ls;},class Offers {List o1; List o2; List o2;} – Artem 2010-07-20 09:43:11

+0

@Element?....請參閱有關子女父母關係的文檔:http://code.google.com/appengine/docs/java/datastore/relationships.html – Jacob 2010-07-20 10:00:25

0

這可能是在對象之間的關係出了問題? 嘗試手動保存複雜對象中的每個對象

+0

如果您保存一個子對象,那麼當您堅持父對象時,您將得到一個異常,除非您將這些對象設置爲單獨的實體集的一部分。 – Jacob 2010-07-20 11:17:19

+0

是的,你說得對! – 2010-07-22 13:46:34

0

看起來您沒有在JDO中正確激活生成器主鍵。這不是JDO的錯誤?

我發現:

「目前的一個錯誤阻止擁有一個一對多的關係 在父母和孩子都是同一類,因此很難 以樹形結構模型中,這將是。在未來版本中修復,您可以通過爲 家長或孩子存儲顯式鍵值來解決此問題。「 」。

http://code.google.com/intl/en-EN/appengine/docs/java/datastore/usingjdo.html

我不能等待修復,所以我已經通過讓我這種類型的所有實體解決此 問題的工作:

  • 具有相同父實體組(的不同的類)
  • 使用ArrayList < [實體]>鍵值來存儲每個實體的「子」
  • 使用鍵值存儲每個實體的「父」(null爲即使它仍然有一個實體組父項)。