使用Hibernate防止违反UNIQUE约束

时间:2016-05-08 23:35:57

标签: java hibernate unique-key

我有一个像(id INTEGER, sometext VARCHAR(255), ....)这样的表,其中id为主键,sometext为UNIQUE约束。它在Web服务器中使用,其中请求需要找到与给定id对应的sometext(如果存在),否则将插入新行。

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

我执行以下操作:

  • 首先,我咨询自己的缓存以避免任何数据库访问。几乎总是这样,我已经完成了。
  • 否则,我使用Hibernate Criteria按sometext查找行。通常,这是有效的,我已经完成了。
  • 否则,我需要插入一个新行。

这种方法很好,除非有两个重叠请求具有相同的sometext。然后是ConstraintViolationException结果。我需要INSERT IGNOREINSERT ... ON DUPLICATE KEY UPDATE(Mysql语法)或MERGE(Firebird语法)之类的东西。

我想知道有什么选择?

AFAIK Hibernate merge仅适用于PK,因此不合适。我想,本机查询可能有所帮助,因为在第二次INSERT发生时它可能会也可能不会被提交。

2 个答案:

答案 0 :(得分:2)

让数据库处理并发。仅用于插入新行的二级事务。如果它因ConstraintViolationException而失败,只需回滚该事务并读取新行。

答案 1 :(得分:1)

如果重复的可能性很高,不确定这会很好地扩展,如果事务的某些百分比(取决于数据库)必须使插入失败然后重新选择,那么很多额外的工作。

辅助事务最小化了添加新文本的事务所花费的时间,假设数据库正确支持它,则线程1事务可能导致线程2选择/插入挂起直到线程1事务已提交或回滚。整体数据库设计也可能影响事务吞吐量。

我不一定质疑为什么某些文字不能成为PK,想知道为什么你需要打破它。当然,如果某些文本记录很大,大量可能会大大节省空间,看起来您似乎正在尝试模拟lucene索引来为您提供完整的文本值列表。