我在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失败,则保存在爱情级别中完成的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的事务并将三个dao保留在同一个事务中。
感谢。
答案 0 :(得分:1)
正常使用jdo并掌握bigtable连接
tx.begin();
...
// Get hold of native connection
JDOConnection jdoConn = pm.getDataStoreConnection();
... cast "jdoConn.getNativeConnection()" to the right type
... (do something with the connection)
jdoConn.close(); // Hands it back to JDO
tx.commit();
至少这是理论,假设GAE / J实现它