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 解析器会抛出异常,因为它不理解特定于数据库的关键字。事实上,HQL 不喜欢任何显式插入,除非它是“INSERT ... SELECT ....
”。
其次,Hibernate 将 SQL 限制为仅选择。如果您尝试调用 session.createSQLQuery("sql").executeUpdate()
,Hibernate 将抛出异常。
第三,Hibernate 的 saveOrUpdate
不适合这种情况。您的测试会通过,但如果您每秒访问的访问者超过一个,您就会遇到生产失败。
我真的要颠覆 Hibernate 吗?
最佳答案
你看过 Hibernate @SQLInsert注释?
@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
关于java - Hibernate 可以使用 MySQL 的 "ON DUPLICATE KEY UPDATE"语法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/913341/