2016-01-26 19 views
2

我使用Kundera-Cassandra 3.2並希望使用昆德拉的事務管理。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);發生錯誤時,該經理回滾事務,但不會做一個更新語句,他將爲合併方法的delete語句。原因是,在調用合併方法時,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'. 

編輯(我的倉庫):

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

完美!那是我的錯 - 我用另一個EntityManager實例獲取實體。當我用相同的管理器實例獲取實體時,回滾就像一個魅力。謝謝 –