Сохраняйте транзакцию между JDO и низкоуровневым API - PullRequest
1 голос
/ 24 марта 2011

У меня есть приложение Spring в движке GoogleApp, которое использует 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 низкого уровня для сохранения объекта2(потому что это расширенное сохранение, которое нельзя сделать с помощью JDO).У меня проблема в том, что я не знаю, как держать их всех в одной транзакции.Если сбой 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 и держать три даос в одной транзакции.

Спасибо.

1 Ответ

1 голос
/ 24 марта 2011

просто используйте jdo как обычно и получите доступ к большегабаритному соединению

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 реализует ее

...