Google App Engine不保存课程中的对象列表

时间:2011-03-24 10:38:33

标签: java google-app-engine datanucleus

我正在使用DataNeucleus JDO实现,它在我的测试服务器上工作正常但在部署时效果不佳。我是GAE的新手,我知道并非所有DataNeucleus功能都受支持。不知道如何使这项工作。

我有一个课说:


@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 个答案:

答案 0 :(得分: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的内容将为空。

在这种情况下,您需要在pm.close()之后移动getBuddyList(),或将其设置为默认提取组(请参阅下文),这将以潜在的性能成本急切预取所有内容。

@Persistent(mappedBy = "myInfoClass", defaultFetchGroup = "true")
private List <BuddyData> buddyList;
祝你好运。