Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cassandra/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 昆德拉·卡桑德拉-事务回滚和实体更新_Java_Cassandra_Kundera - Fatal编程技术网

Java 昆德拉·卡桑德拉-事务回滚和实体更新

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

我使用昆德拉卡桑德拉3.2,希望使用昆德拉的事务管理

我的处理方式如下所示:

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();