Java 昆德拉·卡桑德拉-事务回滚和实体更新
我使用昆德拉卡桑德拉3.2,希望使用昆德拉的事务管理 我的处理方式如下所示:Java 昆德拉·卡桑德拉-事务回滚和实体更新,java,cassandra,kundera,Java,Cassandra,Kundera,我使用昆德拉卡桑德拉3.2,希望使用昆德拉的事务管理 我的处理方式如下所示: EntityManager manager = repo.getEntityManagerFactory().createEntityManager(CassandraRepository.getProperties()); try{ manager.getTransaction().begin(); this.repo.update(account1, manager); //calls the
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();
}
当此.repo.save(account2,manager)中出现错误时代码>发生时,管理器回滚事务,但不执行update语句,而是为merge方法生成delete语句。原因是,当调用merge方法时,kundera创建了一个insert语句而不是update。但是如何说Kundera进行了更新,以使用更新回滚事务
日志:
编辑(我的存储库):
公共类CassandraRepository{
@持久性单位
私人实体管理工厂实体管理工厂;
公共静态映射getProperties(){
最终映射属性=新HashMap();
properties.put(CassandraConstants.CQL_版本,CassandraConstants.CQL_版本3_0);
归还财产;
}
公共无效更新(T实体、EntityManager)引发异常{
试一试{
经理。合并(实体);
}捕获(例外e){
e、 printStackTrace();
投掷e;
}
}
公共void save(T实体、EntityManager)引发异常{
试一试{
经理(实体);
}捕获(例外e){
e、 printStackTrace();
投掷e;
}
}
}
根据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来说都是相似的。你能分享你在save和UPDATE方法中调用的代码吗?我更新了问题这似乎是个bug。。请在上提出问题,我们正在调查。@karthikmanchala问题已创建感谢您的回复,我将其更改为merge
和persist
。但这并不能解决问题。@K.E.我不想改成merge
和persist
。。您需要在更新之前获取实体..完美!这是我的错-我用另一个EntityManager
实例获取了实体。当我获取具有相同管理器实例的实体时,回滚就像一个符咒。非常感谢。
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;
}
}
}
PersonCassandra p = entityManager.find(PersonCassandra.class, "2");
entityManager.getTransaction().begin();
p.setMonth(Month.JAN);
entityManager.merge(p);
entityManager.persist(p3);
entityManager.getTransaction().commit();