1

JDOを使用してオブジェクトを永続化するSpringアプリケーションがGoogleAppエンジンにあります。そのため、サービスレイヤーでこのように使用して、トランザクションを保持しています( @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 では実行できない高度な保存であるため)。私が抱えている問題は、それらすべてを同じトランザクションに保持する方法がわからないことです。愛レベルで行われた sving の保存時に dao3 が失敗した場合、ロールバックされません。

したがって、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 のトランザクションを認識し、3 つの daos を同じトランザクション内に保持するにはどうすればよいでしょうか。

ありがとう。

4

1 に答える 1

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がそれを実装すると仮定すると、少なくともそれは理論です

于 2011-03-24T10:00:11.903 に答える