开发者社区 问答 正文

Hibernate是否可以使用MySQL的“ ON DUPLICATE KEY UPDA?mysql

MySQL支持一种“ INSERT ... ON DUPLICATE KEY UPDATE ...”语法,该语法允许您“盲目”插入数据库,如果存在则回退到更新现有记录。

当您要快速隔离事务并且要更新的值取决于数据库中已有的值时,这将很有用。

举一个人为的例子,假设您要计算在博客上查看故事的次数。使用此语法的一种方法可能是:

INSERT INTO story_count (id, view_count) VALUES (12345, 1) ON DUPLICATE KEY UPDATE set view_count = view_count + 1 这将比启动事务和处理新故事登上首页时不可避免的异常情况更加有效。

我们如何使用Hibernate做到相同或实现相同的目标?

首先,Hibernate的HQL解析器将引发异常,因为它不了解特定于数据库的关键字。实际上,除非是“ INSERT ... SELECT ....”,否则HQL不喜欢任何显式插入。

其次,Hibernate将SQL限制为只能选择。如果您尝试调用Hibernate,它将抛出异常session.createSQLQuery("sql").executeUpdate()。

第三,saveOrUpdate在这种情况下,Hibernate's 不适合该法案。您的测试将通过,但是如果您每秒有一个以上的访问者,那么您将生产失败。

我真的必须颠覆Hibernate吗?

展开
收起
保持可爱mmm 2020-05-17 17:41:03 1025 分享 版权
1 条回答
写回答
取消 提交回答
  • @Entity @Table(name="story_count") @SQLInsert(sql="INSERT INTO story_count(id, view_count) VALUES (?, ?) ON DUPLICATE KEY UPDATE view_count = view_count + 1" ) public class StoryCount来源:stack overflow

    2020-05-17 17:48:46
    赞同 展开评论