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

时间:2010-05-07 07:32:23

标签: java hibernate spring

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

3 个答案:

答案 0 :(得分:9)

这取决于是否有重复是特殊情况,还是业务逻辑情况 例如,在注册期间检查唯一的电子邮件/用户名是一个业务逻辑案例,并且应该在尝试插入之前完成检查

如果您需要使用唯一约束指示哪个字段确实失败了,您最好事先检查它,而不是捕获异常。捕获异常不会给您重要的细节 - 哪个字段失败。

有一些方法可以根据异常获取此信息,但它非常繁琐并且是特定于数据库的(在DB中查找约束名称(特定于db),获取它所应用的字段,匹配具有实体属性的字段)

答案 1 :(得分:4)

最好检查数据库中是否存在数据。检查数据库中是否已存在数据的一种简单方法是让您的类实现Hibernate LifeCyle api。 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;
      }
}

答案 2 :(得分:1)

我肯定会和Bozho一起回答。我认为这正是重点 我目前正在进行的项目中存在类似的问题。我们基于过滤器在多个服务器之间共享信息,并且可能存在已将接收到的对象添加到数据库以便发生PK异常的情况。

在我们的案例中,这些PK冲突非常罕见,因此我们认为这种情况是例外。我们也使用spring和hibernate,为了分离这些问题,由于Springs Transaction-Definitions,我们使用AOP来捕获特定的DataIntegrity-Exception并重新运行Transaction,根据需要进行所需的完整性检查。
如果您需要使用ExceptionHandlerAdvice的帮助,我可以详细说明。