我正在使用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();
}
答案 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;
祝你好运。