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”),则Hibernate会抛出异常executeUpdate()。
第三,Hibernate的saveOrUpdate在这种情况下不符合账单。您的测试将通过,但如果您每秒有多个访问者,则会导致生产失败。
我真的要颠覆Hibernate吗?