我使用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;
}
}
}
你可以分享保存和更新方法中調用的代碼嗎? –
我更新了問題 –
這似乎是一個錯誤..請在[Kundera Git](https://github.com/impetus-opensource/Kundera/issues)上提出問題,我們正在研究它。 –