gpt4 book ai didi

java - Google App Engine 不保存类中的对象列表

转载 作者:行者123 更新时间:2023-12-01 15:54:08 25 4
gpt4 key购买 nike

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

我有一个类说:


@PersistenceCapable
public class MyInfoClass {


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

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

...
}



和好友数据


@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();
}

最佳答案

在 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;

祝你好运。

关于java - Google App Engine 不保存类中的对象列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5417856/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com