java - 防止违反 Hibernate 的 UNIQUE 约束

标签 java hibernate unique-key

我有一个类似 (id INTEGER, sometext VARCHAR(255), ....) 的表,其中 id 作为主键,并且对 有一个 UNIQUE 约束>一些文本。它在 Web 服务器中使用,其中请求需要查找与给定 sometext 对应的 id(如果存在),否则将插入新行。

这是该表上的唯一操作。此表上没有更新,也没有其他操作。它的唯一目的是持续计算遇到的 sometext 值的数量。这意味着我无法删除 id 并使用 sometext 作为 PK。

我执行以下操作:

  • 首先,我查阅自己的缓存以避免任何数据库访问。几乎总是这样,这有效,我就完成了。
  • 否则,我使用 Hibernate Criteria 按 sometext 查找行。通常,这会起作用,然后我就完成了。
  • 否则,我需要插入新行。

这工作得很好,除非有两个重叠的请求具有相同的sometext。然后会产生 ConstraintViolationException 结果。我需要类似 INSERT IGNOREINSERT ... ON DUPLICATE KEY UPDATE (Mysql 语法)或 MERGE ( Firebird 语法)。

我想知道有哪些选项?

据我所知,Hibernate merge 仅适用于 PK,因此它是不合适的。我想, native 查询可能有帮助,也可能没有帮助,因为当第二次插入发生时,它可能会也可能不会提交。

最佳答案

让数据库处理并发即可。纯粹为了插入新行而启动辅助事务。如果它因 ConstraintViolationException 失败,只需回滚该事务并读取新行。

关于java - 防止违反 Hibernate 的 UNIQUE 约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37105963/

相关文章:

Java ElasticSearch 配置的节点都不可用

java - 无法在 Spring Autowiring 字段。为什么?

java - 使用 CSS 样式表在 html 中显示 XML

另一个泛型类的Java泛型类

java - 在 Spring MVC Hibernate 应用程序中,图像路径从 jsp 更改为 Controller 类?

mysql - 我如何在我的表中指定我不能在 3 列中使用唯一或其他命令有两个相同的值?

sql-server - SQL Server中唯一键是聚集索引还是非聚集索引?

java - hibernate 事务和 sql 查询与条件查询

java - JPA - 使用 Root、Join 在字段上加入获取

两个 UNIQUE KEY 上的 MySQL CONSTRAINT,它们使用相同的 FOREIGN KEY ID