我有一个类似 (id INTEGER, sometext VARCHAR(255), ....)
的表,其中 id
作为主键,并且对 有一个 UNIQUE 约束>一些文本
。它在 Web 服务器中使用,其中请求需要查找与给定 sometext
对应的 id
(如果存在),否则将插入新行。
这是该表上的唯一操作。此表上没有更新,也没有其他操作。它的唯一目的是持续计算遇到的 sometext
值的数量。这意味着我无法删除 id
并使用 sometext
作为 PK。
我执行以下操作:
- 首先,我查阅自己的缓存以避免任何数据库访问。几乎总是这样,这有效,我就完成了。
- 否则,我使用 Hibernate Criteria 按
sometext
查找行。通常,这会起作用,然后我就完成了。 - 否则,我需要插入新行。
这工作得很好,除非有两个重叠的请求具有相同的sometext
。然后会产生 ConstraintViolationException
结果。我需要类似 INSERT IGNORE
或 INSERT ... ON DUPLICATE KEY UPDATE
(Mysql 语法)或 MERGE ( Firebird 语法)。
我想知道有哪些选项?
据我所知,Hibernate merge
仅适用于 PK,因此它是不合适的。我想, native 查询可能有帮助,也可能没有帮助,因为当第二次插入发生时,它可能会也可能不会提交。
最佳答案
让数据库处理并发即可。纯粹为了插入新行而启动辅助事务。如果它因 ConstraintViolationException 失败,只需回滚该事务并读取新行。
关于java - 防止违反 Hibernate 的 UNIQUE 约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37105963/