有可持续的类Project,其每个实例都有Version类型的对象列表(Project和Version类之间拥有一对多的关系)。
我从带有查询的数据存储区中获取了多个Version对象,更改它们并尝试保存:
PersistenceManager pm = PMF.get().getPersistenceManager();
Transaction tx = pm.currentTransaction();
try {
tx.begin();
Query q = pm.newQuery(Version.class, "... filters here ...");
q.declareParameters(" ... parameters here ...");
List<Version> versions = (List<Version>)q.execute(... parameters here ...);
if (versions.size() > 0) {
for (Version version : versions) {
version.setOrder(... value here ...);
}
pm.makePersistentAll(versions);
}
tx.commit();
return newVersion.toVersionInfo();
} finally {
pm.close();
}
一切都没有错误地执行,查询实际上返回了几个对象,在运行时版本列表中正确设置了属性,但是在数据存储区中没有更新对象属性。
一般来说,据我所知,即使不打电话
也应保存版本pm.makePersistentAll(versions);
,因为对象属性是在pm.close()之前设置的,但是没有保存,如果省略了这一行。
同时,如果我使用pm.getObjectById()方法检索Project类型的实例(它拥有许多类型为Version的实例),并遍历循环中所有相关的Version对象,则所有更改都会正确保存(不带调用pm.makePersistent()方法)。
问题是,这种更新对象的方式有什么问题?为什么版本对象属性未在数据存储区中更新?
我在JDO和GAE文档中都找不到任何有用的东西。
答案 0 :(得分:0)
感谢有关DataNucleus的日志和Peter Recore的同情的建议:)
坦率地说,在我的问题中,我错过了一些重要的观点。实际上,间
tx.begin();
和
Query q = pm.newQuery(Version.class, "... filters here ...");
我正在检索Project实例,并且在Version实例更新循环之后,我再坚持使用一个Version对象。
所以,我实际上检索了一些版本列表两次,并且根据日志中的提交顺序,Project实例也被保存了两次。第二个保存操作覆盖了第一个。
我改变了操作的顺序,并获得了预期的行为。