2015-10-15 71 views
1

考慮一個存在於數據庫中的實體。 一個事務中發生下列操作 -在事務中兩次保持同一個實體的錯誤

mainfuntion() 
{ 
    transaction.begin(); 
    function1(); 
    if(check some business logic) 
    { 
     function2() 
    } 
    transaction.commit() 
} 
function1() 
{ 
    query1 - returns Entity 
    modify Entity; 
    EntityManager.persist(Entity) 
} 
function2() 
{ 
    query1 - returns Entity 
    modify Entity 
    EntityManager.persist(Entity) 
} 

現在發生的兩處修改作出保留的意義邏輯分開,因此我不希望俱樂部的兩處修改。我也不希望在兩種方法之間傳遞實體。

在提交我得到下面的異常 -

org.hibernate.StaleStateException: Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1 

誰能告訴我怎麼可以實現無差錯所期望的結果?

+0

在函數2中,合併實體並且不再堅持它 –

+0

試過,如果已經存在於持久性上下文中,則將其合併。不起作用。 :( – akshay202

+0

@LaurentiuL。 – akshay202

回答

1

您是否在實體中使用了帶日期/時間戳的@Version註釋? 我以前遇到類似的情況。在嘗試使用@Version列更新實體時休眠,在更新語句中包含@Version列以及主鍵。

休眠文檔提到這一點 -

當使用java.util.Date,而不是長/長爲修訂 時間戳,注意不要將其存儲到列數據類型這將 鬆散的精度。

這會導致第二個更新語句不會獲取所需的行,從而導致意外的行計數異常。

嘗試使用不帶@Version註釋或整數/長整數版本。

相關問題