2010-10-27 62 views
1

我使用Spring + Hibernate在MySQL數據庫中創建和存儲記錄。hibernate spring:PrePersist商業邏輯的地方?

就在堅持一條記錄之前,我希望我的系統生成一個隨機字符串,它將存儲在存儲實體的字段中。這個隨機字符串稍後將用作訪問鍵來檢索記錄並確認用戶的輸入。

我想在我的實體類中使用@PrePersist註解來實現這種行爲。這是放置這種方法的適當位置嗎?

這個問題發生在我身上,因爲我不知道如何檢查數據庫表的唯一性的隨機字符串,因爲我想不到一種方法來引用春天的HibernateTemplate實例做實體類內的查詢。

任何建議,非常感謝。

+0

@PrePersist是JPA,而不是休眠。如果你使用JPA,你應該使用JpaTemplate而不是HibernateTemplate。 – 2010-10-27 15:32:07

+0

感謝Seanizer,我是Hibernate和JPA的新手。我在Hibernate文檔中找到了PrePersist註釋,但是您可能正確使用JpaTemplate而不是HibernateTemplate。 但是,實體類是做我想做的事情的適當位置,我將如何能夠從該類內檢查我生成的列值的唯一性? – Baris 2010-10-27 15:58:40

回答

0

就在堅持記錄之前,我希望我的系統能夠生成一個隨機字符串,它將存儲在存儲實體的字段中。

A PrePersist生命週期回調方法對於這種用例來說確實是完美的。

這個問題發生在我,因爲我不知道如何檢查數據庫表中的隨機字符串的唯一性,因爲我不能想辦法從內部參考春天的HibernateTemplate的情況下做一個查詢實體類。

HibernateTemplate/JpaTemplate與否,實際上是沒有辦法使用SQL查詢來檢查值的唯一性(至少不是100%確定的方式),而鎖定整個表,你可能不想要那個。在整個表上沒有鎖的情況下,可以面對競爭條件:當線程T1執行select時,線程T2可以插入T1未找到並首先提交的值,導致T1後續插入失敗。

換句話說,保證唯一性或列的唯一方法是插入記錄並提交事務(數據庫可以使用延遲約束檢查,以便提交是必需的)。

+0

感謝您的想法。事實上,我不想鎖定桌子。因此,如果我理解正確,我需要嘗試持續記錄,並讓數據庫檢查列中字段值的唯一性並捕獲數據庫可能拋出的錯誤。那是對的嗎? – Baris 2010-10-28 14:35:16

+0

@巴黎是的,就是這樣。 – 2010-10-28 14:38:40