我正在学习使用Hibernate.我想知道如何正确地在休眠中进行并发插入.我有一个url表定义为:CREATE TABLE `urls` (id INT PRIMARY KEY AUTO_INCREMENT, md5 CHAR(32) UNIQUE, url TEXT);该表的目的是维护映射id - ...
我正在学习使用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在发生并发插入时正常运行.
本文标题为:java – Hibernate并发插入(MySQL INSERT IGNORE)
基础教程推荐
- Maven分步详解多环境配置与应用流程 2023-04-17
- Java实现可配置换肤的方法示例 2023-01-08
- 关于swagger配置及踩坑@Api参数postion无效解决接口排序问题 2023-01-02
- Java如何通过反射获取Constructor、Field、Method对象 2022-12-19
- 详解使用Spring Data repository进行数据层的访问问题 2023-01-02
- jsp中变量及方法的声明与使用 2023-08-03
- java JVM方法分派模型静态分派动态分派全面讲解 2023-01-29
- 基于Ant路径匹配规则AntPathMatcher的注意事项 2023-08-07
- Mybatis的类型转换接口TypeHandler 2023-04-06
- SpringMVC拦截器创建配置及执行顺序 2022-11-23
