2011-01-08 87 views
4

我正在學習使用Hibernate。我想知道如何正確地在hibernate中進行併發插入。Hibernate +併發插入(MySQL INSERT IGNORE)

我有一個URL表定義爲:

CREATE TABLE `urls` (
    id INT PRIMARY KEY AUTO_INCREMENT, 
    md5 CHAR(32) UNIQUE, 
    url TEXT 
); 

表目的是保持一個映射ID < - >的URL。 md5字段是來自url的md5總和,因爲通常url可以超過1024個字節,這是mysql中UNIQUE約束的限制。

我的問題是關於URL查詢 - > id函數處理併發性。在JDBC實現我做這些步驟:

  1. SELECT id其中MD5 = MD5(URL);
  2. if exists,return id,else:
  3. INSERT IGNORE INTO urls(md5,url)VALUES(MD5(url),url);
  4. 重試步驟1

即使插入步驟2和3。如何做到這一點與Hibernate之間的請求的URL它的工作原理很好嗎?

回答

2

你可以玩的註解@SQLInsert。它允許您指定在插入期間使用哪個SQL語句。問題是:Hibernate做的不僅僅是從數據庫插入/更新/選擇數據。也就是說,我確信通過使用@SQLInsert最初可能會起作用,但我不確定Hibernate在您遇到您描述的場景(步驟2和3之間的併發插入)時會如何表現,特別是因爲它不執行第4步。相反,它調用JDBC的「getGeneratedKeys」來檢索生成哪個ID(如果插入被忽略,我懷疑它會爲空)。

總之:我看到的是使用@SQLInsert唯一的解決辦法,但你會希望與發揮,確保Hibernate的行爲正確時併發插入發生。