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

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

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

如果您需要使用唯一约束指示哪个字段确实失败了,您最好事先检查它,而不是捕获exception。 捕获exception并不能为您提供重要的详细信息 – 哪个字段已失败。

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

最好检查数据库中是否存在数据。 检查数据库中是否已存在数据的一种简单方法是让您的类实现Hibernate LifeCyle api。 Hibernate允许您在保存之前但在身份与bean关联之后执行validation行为。 如果某些逻辑被违反或失败,则可以否决保存操作。

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 beans = query.list(); if (beans != null && !beans.isEmpty()) { // This does not save the identity. return VETO; } return NO_VETO; } } 

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

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