【问题标题】:Keep transaction between JDO and low-level API保持 JDO 和低级 API 之间的事务
【发布时间】: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


【解决方案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 实现了它

【讨论】:

  • 我不知道我必须转换对象的类型,所以我试图在调试模式下查看 getNativeConnection() 方法返回的内容。当我执行 jdoConn.getNativeConnection() 时,我得到一个空对象(在调用 dao1.save(object) 之前和之后它都是空的(我都试过了))。所以我不能对这个对象做任何事情。
  • 所以在code.google.com/p/datanucleus-appengine/issues/list 上提出一个错误,因为他们声称实现了 JDO 但缺少该功能
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多