【发布时间】:2011-07-21 23:48:22
【问题描述】:
我在 GoogleApp 引擎中有一个 Spring 应用程序,它使用 JDO 来持久化对象。所以我在我的服务层中以这种方式使用它来保存事务(使用@Transactional 注释)。
@Transactional
public void save(Object object) {
dao1.save(object); // dao1 saves using JDO
Object object2 = generate1Object(object)
dao2.save(object2); // dao2 saves using low level API
Object object3 = generate2Object(object)
dao3.save(object3); // dao3 saves using JDO
}
我遇到的问题是我需要使用低级 API 来持久化 object2(因为它是高级保存,无法使用 JDO 完成)。我遇到的问题是我不知道如何将它们全部保存在同一个事务中。如果dao3在love关保存sving失败时不回滚。
所以在dao2中我是这样坚持的:
//save using low-level API
public void save(Object object){
DatastoreService datastore = DatastoreServiceFactory.getDatastoreService();
Entity entity = generateEntity(object);
datastore.put(entity);
}
在 dao1 和 dao3(使用 JDO 的)我有这样的东西:
//save using JDO
public void save(Object object) {
PersistenceManager pm = PMF.get().getPersistenceManager();
pm.makePersistent(object);
}
我已经看到数据存储对象有一个名为:
datastore.getCurrentTransaction()
但对我来说它是空的。如何让底层感知JDO的事务,并保持三个daos在同一个事务中。
谢谢。
【问题讨论】:
-
“高级保存”?这是什么意思?
-
@Nick Johnson 只是要保存的对象具有基于 UUID 名称的不同属性名称。因此,当我保存时,我必须使用该 UUID 设置列中的每个值。但我无法提前知道 UUID 名称,所以我使用低级 API 持久化它们。
-
听起来您应该使用 Objectify 之类的东西,而不是尝试结合 JDO 和低级 API 来破解解决方案。
-
@Nick Johnson 我已经在考虑了,尽管现在在项目中很难将 JDO 更改为 Objectify。谢谢。
标签: java spring google-app-engine jdo low-level-api