2011-05-24 40 views
1

您是否能够在App Engine上的嵌入类中存储HashMap? 我有以下类别:嵌入类中的JDO - HashMap

@Persistent(serialized = "true") 
@Embedded 
private Stats stats; 

@PersistenceCapable 
@EmbeddedOnly 
public static class Stats implements Serializable { 
    private static final long serialVersionUID = 1L;   
    @Persistent(serialized = "true", defaultFetchGroup="true") 
    private Map<String, Integer> requests; 

    public Stats() { 
     requests = new HashMap<String, Integer>(); 
    } 
} 

然而,当我试图将项目添加到HashMap中,并坚持它,我得到以下错误:

指定的类类com.google.appengine.api .datastore.Blob不可持久化

我知道你可以在一个“普通”类中成功使用HashMap,但是它们也可以在嵌入类中使用吗?

感谢

+0

同样的问题在我身边。不同的是,我得到的错误消息是“HashMap不是受支持的属性类型”(我的类不是EmbeddedOnly,可能会产生影响)。 – 2011-07-21 15:21:25

+0

http://groups.google.com/group/google-appengine-java/browse_thread/thread/2b42a00903a3441a讨论了这个问题 - 尽管没有有用的答案。 – 2011-07-21 15:24:46

回答

0

我还没有与嵌入类试过,但我里面JDO对象映射需要对包含类附加FetchGroup注解:

@SuppressWarnings("serial 

     ") 
     @PersistenceCapable(identityType=IdentityType.APPLICATION, detachable="true") 
     @FetchGroup(name="QueryAggregationJobJDO", members={ 
               @Persistent(name="appName", recursionDepth=-1), 
etc....           
     public class QueryAggregationJobJDO extends AggregationJobJDO implements SystemObject { 
      @Persistent(serialized="true") // this is string of app names and a count for each name found 
      public Map< String, Long > appName = new HashMap<String, Long>(); 

,我们不得不添加此类打开我们的数据管理器时使用getFetchPlan()...

@Override 
public boolean open() { 
    DataAreaManager dataAreaManager = new DataAreaManager(); 
    dataAreaManager.setDataArea(VERSION_DATA_AREA); 

    if ((pm == null) || (pm.isClosed())) { 

     pm = PMF.get(type).getPersistenceManager(); 
     pm.getFetchPlan().addGroup("TouchActiveUserJDO"); 
     pm.getFetchPlan().addGroup("UserRoleJDO"); 
     pm.getFetchPlan().addGroup("QueryAggregationJobJDO");