微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

java – Hibernate并发插入(MySQL INSERT IGNORE)

我正在学习使用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约束的限制.

我的问题是关于url的查询 – > id函数处理并发.在JDBC实现中,我执行以下步骤:

> SELECT id WHERE md5 = md5(url);
>如果存在,则返回id,否则:
> INSERT IGnorE INTO urls(md5,url)VALUES(MD5(url),url);
>重试步骤1.

即使在步骤2和3之间插入请求的url,它仍然可以正常工作.如何使用Hibernate执行此操作?

解决方法:

您可以使用注释@SQLInsert.它允许您指定在插入期间使用哪个sql语句.问题是:Hibernate不仅仅是插入/更新/选择数据库中的数据.也就是说,我很确定只是通过使用@sqlInsert可能会起作用,但我不确定当你遇到你所描述的场景(步骤2和3之间的并发插入)时Hibernate会如何表现,特别是因为它不执行第4步.相反,它调用JDBC的“getGeneratedKeys”来检索生成了哪个ID(我怀疑,如果忽略插入,它将为null).

简而言之:我看到的唯一解决方案是使用@sqlInsert,但您需要使用它并确保Hibernate在发生并发插入时正常运行.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐