在JDO和低级API之间保持事务

时间:2011-03-24 09:40:44

标签: java spring google-app-engine jdo low-level-api

我在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保留在同一个事务中。

感谢。

1 个答案:

答案 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实现它