2011-01-08 86 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的行为正确时并发插入发生。