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吗?
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
@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