2013-02-27 83 views
1

我正在使用Hibernate。服務作爲web服務公開。這項服務將由2個應用程序調用。該服務方法將記錄保存到數據庫中。使用hibernate的主鍵違規問題?

ServiceClass.java: 
------------------ 

//Here Transaction will start 
public void saveRecord(SampleEntity entity){ 

someDAO.saveData(entity); 

} 


SomeDao.java 
----------------- 

public void saveData(SampleEntity entity){ 
    //record is saved using saveOrUpdate method 
} 

如果saveRecord方法由兩個應用at a time與相同的ID調用,PK violation exception被拋出。

這兩個應用程序都在發送具有相同ID的記錄。

因爲我們正在使用saveOrUpdate它應該更新記錄,如果它已經存在。

+0

您必須從數據庫獲取現有實體並更新其值。如果它不存在(hibernate返回null),那麼你創建它。 – DominikM 2013-02-27 11:03:30

+1

你是手動設置ID還是由Hibernate生成? – overmeulen 2013-02-27 11:05:57

+0

我們做同樣的事情,但沒有用。我的直覺是,應用程序調用一個實體傳遞存儲方法,但在將記錄保存到數據庫之前,第二個應用程序也會打電話保存。由於應用程序尚未插入記錄,所以顯然DB不會有記錄。 – user1016403 2013-02-27 11:06:09

回答

1

如果這是在一個事務中,該行將被鎖定(並且索引未更新),直到事務提交。因此,如果更新發生在提交之前,它可能看起來像兩個具有相同PK的插入。

+0

感謝您的回覆!是....任何推薦的解決方案? – user1016403 2013-02-27 14:55:37

+0

很大程度上取決於您的應用程序的佈局。一種想法是將邏輯放入仲裁存儲的保存服務類(確保在更新觸發前完成)。或者把實際的保存放在這樣做的門面之後(可能更乾淨)。你可以做一些事情,比如在進程中保存一張PK的靜態地圖(在路上添加和清除)。可能想要一個同步的地圖或塊在這裏使這個模糊的安全。 – WPrecht 2013-02-27 16:18:39