无法同步数据库状态

时间:2014-11-29 15:58:29

标签: java database hibernate jpa orm

我有一个Java类 ClassA ,这个类定义了hibernate映射。 在代码的某处,我需要检索保存在数据库中的这个类的所有实例:

public List<ClassA> getAllClassA(){
    Criteria crit = getSession().createCriteria(ClassA.class);
    return crit.list();
}
allA = getAllClassA();

稍后我将删除一些对象,同时更新其他对象:

public void removeItem() {
    Iterator<ClassA> it = allA.iterator();
    while(it.hasNext()){
        ClassA cA = it.next();
        if(cA.hasCondition()){
            dao.remove(cA);
            it.remove();
        }
        else {
            cA.update();
        }
    }
    dao.update(allA);
}
//this is in another class
public void update(List<ClassA> allA){ //dao.update
    for(ClassA cA: allA){
        getSession().saveOrUpdate(cA);
    }
}

发生的情况是数据库已正确更新(并删除了所需的对象),但它也会发出以下错误:

  

ERROR   org.hibernate.event.def.AbstractFlushingEventListener.performExecutions:324    - 无法与会话org.hibernate.StaleStateException同步数据库状态:批量更新返回意外   来自update [0]的行计数;实际行数:0;预期:1

我知道Stack Overflow还有其他类似的问题,但它们似乎来自不同的条件,在这种情况下没用。

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

optimistic locking机制可防止因并发请求而导致更新丢失。如果您说数据库已正确更新,则意味着其他一些线程可能试图更新您刚刚删除的某些实体。

总是存在遇到这种情况的风险。大多数情况下,最好放弃请求并从最新的数据库实体状态重新启动流程。

答案 1 :(得分:0)

我不确定原因,但如果在更新后执行删除,则问题就消失了:

public void removeItem() {
    Iterator<ClassA> it = allA.iterator();
    ClassA toRemove = null; 
    while(it.hasNext()){
        ClassA cA = it.next();
        if(cA.hasCondition()){
            toRemove = cA;
            it.remove();
        }
        else {
            cA.update();
        }
    }
    dao.update(allA);
    if(toRemove!=null)dao.remove(toRemove);
}