簡體   English   中英

無法同步數據庫狀態

[英]Could not synchronize database state

我有一個Java類ClassA ,該類具有定義的休眠映射。 在代碼中的某個地方,我需要檢索保存在數據庫中的此類的所有實例:

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

發生的情況是數據庫已正確更新(並刪除了所需的對象),但它還會吐出以下錯誤:

錯誤org.hibernate.event.def.AbstractFlushingEventListener.performExecutions:324-無法將數據庫狀態與會話org.hibernate.StaleStateException同步:批處理更新從更新[0]返回意外行數; 實際行數:0; 預期:1

我知道關於堆棧溢出還有其他類似的問題,但是它們似乎是由不同的情況引起的,在這種情況下沒有用。

有任何想法嗎?

樂觀鎖定機制可防止由於並發請求而導致更新丟失。 如果您說數據庫已正確更新,則意味着其他線程可能試圖更新剛刪除的某些實體。

總是有遇到這種情況的風險。 在大多數情況下,最好放棄請求並從最新的數據庫實體狀態重新開始流程。

我不確定為什么,但是如果在更新執行刪除,問題就消失了:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM