我正在学习使用Hibernate。我想知道如何正确地在休眠中进行并发插入。
我有一个url表定义为:
CREATE TABLE `urls` (
id INT PRIMARY KEY AUTO_INCREMENT,
md5 CHAR(32) UNIQUE,
url TEXT
);
该表的目的是维护映射ID< - >网址。 md5字段是来自url的md5和,因为通常url可以长于1024字节,这是mysql中UNIQUE约束的限制。
我的问题是关于网址的查询 - > id函数处理并发。在JDBC实现中,我执行以下步骤:
即使在步骤2和3之间插入了请求的url,它仍然可以正常工作。如何使用Hibernate执行此操作?
答案 0 :(得分:2)
您可以使用注释@SQLInsert。它允许您指定在插入期间使用哪个SQL语句。问题是:Hibernate不仅仅是插入/更新/选择数据库中的数据。也就是说,我很确定只是通过使用@SQLInsert可能会起作用,但我不确定当你遇到你所描述的场景(步骤2和3之间的并发插入)时Hibernate会如何表现,特别是因为它不执行第4步。相反,它调用JDBC的“getGeneratedKeys”来检索生成了哪个ID(我怀疑,如果忽略插入,它将为null)。
简而言之:我看到的唯一解决方案是使用@SQLInsert,但你会想要使用它并确保Hibernate在发生并发插入时表现正常。