代码之家  ›  专栏  ›  技术社区  ›  Dean Povey

使用Spring Hibernate模板时检测重复项的最佳方法

  •  4
  • Dean Povey  · 技术社区  · 15 年前

    我们有一个应用程序需要在创建时检测某些字段中的重复项。我们使用Hibernate作为持久层,并使用Spring的HibernateTemplate。我的问题是,在创建项目之前,是否最好预先查找项目,或者尝试捕获DataIntegrityViolation异常,然后检查这是否是由重复条目引起的。

    3 回复  |  直到 15 年前
        1
  •  9
  •   Bozho    15 年前

    这取决于拥有一个副本是一个例外的场景,还是一个业务逻辑案例。
    例如,在注册期间检查唯一的电子邮件/用户名是一个业务逻辑案例,在尝试插入之前应该进行检查

    如果需要指示哪个字段在唯一约束下失败,那么最好事先检查它,而不是捕获异常。捕获异常并不能提供重要的细节——哪个字段失败了。

    有一些方法可以根据异常获取此信息,但它非常繁琐且特定于数据库(在数据库中查找约束名(特定于数据库),获取应用它的字段,将字段与Entity属性匹配)

        2
  •  4
  •   Kartik    15 年前

    最好检查数据库中是否存在数据。检查数据库中是否已经存在数据的一个简单方法是让类实现休眠。 LifeCyle 应用程序编程接口。Hibernate允许您在保存之前验证行为,但是在将标识与bean关联之后。如果违反或失败了某些逻辑,则可以否决保存操作。

    public class Bean extends Serializable implements org.hibernate.classic.LifeCycle {
          public boolean onSave(Session s) {
              Query query = session.createQuery(from Bean b where b.field=:field");
              query.setParameters("field", this.field);
              @SuppressWarnings("unchecked")
              List<Bean> beans = query.list();
              if (beans != null && !beans.isEmpty()) {
                  // This does not save the identity.
                  return VETO;
              }
              return NO_VETO;
          }
    }
    
        3
  •  1
  •   zoidbeck    15 年前

    我绝对同意博佐的回答。我认为这正是关键所在。
    我目前正在进行的项目中也存在类似的问题。我们正在基于过滤器在多个服务器之间共享信息,并且可能存在一些场景,其中接收到的对象已经添加到数据库中,因此会发生pk异常。

    在我们的情况下,这些PK冲突是非常罕见的,因此我们认为这种情况是例外。我们还使用Spring和Hibernate,为了分离这些问题,由于Spring事务定义的原因,我们使用AOP捕获特定的数据完整性异常,并根据需要重新运行事务进行完整性检查。
    如果您需要帮助,我可以使用exceptionhandler建议对此进行详细说明。