mysql - Hibernate @SQLInsert 和重复键

标签 mysql hibernate insert-update

在 Hibernate 中,您可以使用 @SQLInsert定义自定义插入查询。 Hibernate 使用准备好的语句,因此您只需提供 ?作为占位符,如下所示:INSERT INTO table (colA, colB) VALUES (?,?)

colA 的重复键上,我要colB要更新为新值,所以我尝试 INSERT INTO table (colA, colB) VALUES (?,?) ON DUPLICATE KEY UPDATE colB = ? - 然而,这会引发没有给出第三个参数的错误。 (没有为参数 3 指定值)

如何为 hibernate 编写此查询的正确方法?任何不依赖数据的更新,例如 INSERT INTO table (colA, colB) VALUES (?,?) ON DUPLICATE KEY UPDATE colB = colB +1正在工作 - 但我需要设置 colB 的实际值已通过插入调用传递。

最佳答案

正确的答案是使用以下语句:

INSERT INTO table (colA, colB) VALUES (?,?) ON DUPLICATE KEY 
UPDATE colB = VALUES(colB);

然而,问题出现了,一旦执行了更新语句,hibernate 就没有收到自动增量值。

我找到了以下博客文章 ( http://www.jroller.com/mmatthews/entry/getting_hibernate_and_mysql_s ) 并将查询修改为以下内容:

INSERT INTO table (colA, colB) VALUES (?,?) ON DUPLICATE KEY 
UPDATE colB = VALUES(colB), id = LAST_INSERT_ID(id);

终于起作用了。

这种方法的一个无法解决的问题是,在同一事务中插入两个相等的实体不起作用。即使第二次插入会导致正确的更新,em 最终也会得到代表同一数据库行的 2 个实体实例 - 这是不允许的。

要解决这个问题,只需确保您不会插入两个由于约束而呈现相等的实体。 (我对 equals/hashcode 使用了与复合唯一键约束相同的逻辑,因此我能够在执行批量插入时消除此类重复项)

关于mysql - Hibernate @SQLInsert 和重复键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28580151/

相关文章:

php - 有什么方法可以修复此代码以避免错误 : Duplicate entry '1' for key 'PRIMARY' each time

java - JaVers:没有 Spring 的 Hibernate 集成

java - 在线程中重用 Hibernate session

php - 如果记录相同则更新 SQL 行

php - sql - double where 条件不起作用

php - fatal error : Uncaught Error: Call to a member function query()/prepare() on null. PDO 功能不起作用。它总是说调用成员函数

php - 从不同的网络连接到 MySQL 数据库?

java - MySQL 表在重新启动 Tomcat 服务器时自动删除

iphone - FMDB:错误 14,无法打开数据库文件

php - 尝试将 "insert and update"查询转换为 mysqli