【问题标题】:Best way to check duplicate records in database | Hibernate检查数据库中重复记录的最佳方法 |休眠
【发布时间】:2014-10-27 21:01:48
【问题描述】:

我需要在数据库中创建礼品卡实体,其中礼品卡代码是由算法生成的,并且它们发生冲突的可能性非常低。

在 DB 中插入礼品卡实体之前,我们需要检查重复礼品卡实体的可能性。

还需要注意以下几点

  1. 需要生成与管理员要求相同数量的礼品卡实体
  2. 为了遵循第 1 点,我们需要找到 DB 中已经存在的礼品卡代码,并且需要再次生成代码。

我正在使用 Hibernate 进行数据库操作,并且我有以下选项。

第一个选项

  1. 创建礼品卡代码列表
  2. 开始为每个礼品卡代码创建实体并尝试将它们插入 DB。
  3. 如果我们发现预先存在的礼品卡实体有任何异常,请将该代码存储在废弃代码列表中。
  4. 对废弃列表再次重复处理

第二个选项

  1. 生成礼品卡代码列表。
  2. 在创建礼品卡实体之前检查数据库中的重复代码。
  3. 对于废弃列表,再次创建礼品卡代码并按照第 2 点操作。
  4. 为最终列表创建实体并插入数据库

我对哪种方法更可取感到有些困惑?

【问题讨论】:

  • 使用数据库触发器来生成代码怎么样?
  • @Kayaman:不,我们想要特定的模式,比如代码的数字长度、字母、数字等
  • 这如何阻止您使用触发器?它将在重复代码上运行,创建一个新代码并尝试插入它。
  • @Kayaman : 你能解释一下你在说什么吗,我想,我误解了你的意思:)
  • 其实可能不值得。这是可能的,但它可能不会更好或更有效。

标签: java sql hibernate jpa jpa-2.0


【解决方案1】:

为确保不允许重复,您必须对用于存储礼品卡代码的列具有唯一索引和/或唯一约束。

也就是说,我会推荐第一个选项,因为如果礼品卡代码重复的可能性较低,它会更有效。同样在第二个选项中,即使您在插入新代码之前检查重复项,也不能保证在检查和插入之间没有在数据库中插入具有相同值的代码,因此您还必须处理这种情况当插入引发约束异常时。

【讨论】:

  • 感谢您的输入,尽管代码在 DB 中肯定是唯一的,我也有点倾向于选项 1。
  • 唯一需要注意的是事务处理,如果你有大量代码要生成,你不​​希望事务只因为一个错误代码而回滚
【解决方案2】:

我会创建所有,然后使用 JPQL lilke 检查重复值:

select p from Ticket p where p.id in (:idList)

使用这种“批处理”操作,您无需在每次迭代时访问数据库。那是您的第一个选项的问题。

如果您使用某种数据库规则,例如:约束或触发器,您可能会收到可能导致事务回滚的异常。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-03
    • 2013-03-31
    • 2016-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多