2016-01-26 1 views
2

Я использую Kundera-Cassandra 3.2 и хочу использовать управление транзакциями из Kundera.Kundera cassandra - Откат транзакции и обновление сущности

Моей обработка выглядит следующим образом:

EntityManager manager = repo.getEntityManagerFactory().createEntityManager(CassandraRepository.getProperties()); 

try{ 
    manager.getTransaction().begin(); 

    this.repo.update(account1, manager); //calls the merge method of the Entitymanager 
    this.repo.save(account2, manager); //calls the persist method of the Entitymanager 

    manager.getTransaction().commit(); 

} catch(Exception e){ 
    if(manager.getTransaction().isActive()){ 
     manager.getTransaction().rollback(); 
    } 
} finally { 
    manager.clear(); 
    manager.close(); 
} 

Когда ошибка в this.repo.save(account2, manager); происходит, менеджер откаты сделки, но не делает заявление обновления, он делает ВЕИТ для метода слияния. Причина этого в том, что при вызове метода merge kundera создает инструкцию insert, а не обновление. Но как сказать Kundera сделать обновление для отката транзакции также с обновлением.

Журналы:

12:42:41.185 [http-bio-8080-exec-3] INFO com.impetus.client.cassandra.CassandraClientBase - Returning delete query DELETE FROM "account" WHERE "id" = 'MCSP-000000000004'. 
12:42:41.211 [http-bio-8080-exec-3] INFO com.impetus.client.cassandra.CassandraClientBase - Returning delete query DELETE FROM "account" WHERE "id" = 'MCSP-000000000005'. 

EDIT (мой репозиторий):

public class CassandraRepository<T> { 

    @PersistenceUnit 
    private EntityManagerFactory entityManagerFactory; 

    public static Map<String, String> getProperties() { 
     final Map<String, String> properties = new HashMap<String, String>(); 
     properties.put(CassandraConstants.CQL_VERSION, CassandraConstants.CQL_VERSION_3_0); 
     return properties; 
    } 



    public void update(T entity, EntityManager manager) throws Exception{ 
     try { 
      manager.merge(entity); 
     } catch (Exception e) { 
      e.printStackTrace(); 
      throw e; 
     } 
    } 

    public void save(T entity, EntityManager manager) throws Exception{ 
     try { 
      manager.persist(entity); 
     } catch (Exception e) { 
      e.printStackTrace(); 
      throw e; 
     } 
    } 
} 
+0

Можете ли вы поделиться кодом, который вы вызываете внутри методов сохранения и обновления? –

+0

Я обновил вопрос –

+0

Это, кажется, ошибка .. пожалуйста, поднимите вопрос на [Kundera Git] (https://github.com/impetus-opensource/Kundera/issues), мы изучаем его. –

ответ

1

Согласно JPA, чтобы обновить объект, вы должны сначала привести его в управляемом состоянии (за счет извлечения его)

Пример: -

 PersonCassandra p = entityManager.find(PersonCassandra.class, "2"); 

     entityManager.getTransaction().begin(); 
     p.setMonth(Month.JAN); 
     entityManager.merge(p); 
     entityManager.persist(p3); 
     entityManager.getTransaction().commit(); 

Проблема не с заявлениями INSERT и UPDATE, поскольку оба они похожи для Cassandra, под капотом.

+0

Спасибо за ответ, я изменю его на 'merge' и' persist'. Но это не решит проблему. –

+0

@ K.E. Я не хочу переходить на 'merge' и' persist'. Вам нужно получить объект перед обновлением. –

+0

Perfect! Это была моя ошибка - я получил объект с другим экземпляром «EntityManager». Когда я получаю объект с тем же экземпляром менеджера, откат работает как шарм. Спасибо –

 Смежные вопросы

  • Нет связанных вопросов^_^