2012-05-28 105 views
2

我已經編寫了一個應用程序,它從Oracle Db中的表中一次讀取1條記錄,對它進行一些處理,然後再次將其保存到同一個表中。 我也在表中維護一個狀態列來跟蹤我當前的記錄progress.For例如。最初記錄狀態是'N',選擇後我將其更新爲'U',最後將其更改爲'P'。使用java休眠標準做單個查詢時選擇並更新API

現在我的問題是我想運行這個應用程序的許多實例,但攔截器是同一行可能會選擇不同的實例,因爲選擇和更新狀態'U'不是一個單一的查詢。所以它可能發生過程1選擇那麼Process2選擇相同的記錄,然後Process1更新狀態爲'U'。我必須解決這個問題才能使我的應用程序分發。

我已經創建了選擇和更新查詢作爲單個事務,但我猜是因爲這不會解決問題。我的這種邏輯是正確的嗎?

我正在使用Hibernate來訪問數據庫。任何人都有想法如何使用Hibernate java來實現這一點?

如果我上面的邏輯(關於事務)是正確的,那麼我可以通過2種方法做到這一點,如果任何這些是由休眠提供的。

1 - 選擇在1個查詢

更新記錄2,選擇一行,並在1個查詢鎖定它,然後運行同一個事務的另一個查詢來更新狀態爲「U」。在Sql中,我可以通過在查詢結束時使用'for update'來做到這一點,但我不知道如何使用'Hibernate標準'來做到這一點。標準也有一個API'forUpdate',但我想這不是功能,因爲查詢生成在那種情況下,Hibernate在最後沒有'for update'。

有人可以幫我在這

+0

對不起Criteria有'setLockMode'API不是'forUpdate'API – Rahul

+0

你可以編輯你的文章。 – JMelnik

回答

2

是的,可以使用標準一個查詢。

我正在寫一個例子。我希望這對你有所幫助。

public void updateEmployee(int empid,String firstname, String lastname, String email) 
{ 
    sf=connect(); // get connection 
    Session session=sf.openSession(); 
    Transaction t=session.beginTransaction(); 

    Employee emp= (Employee) session.get(Employee.class, empid); 
    emp.setFirstname(firstname); 
    emp.setLastname(lastname); 
    emp.setEmail(email); 

    session.update(emp); // Update employee 
    t.commit(); 
    session.close(); 
}