在UI级别处理唯一约束违规的最佳实践

时间:2011-03-13 15:59:25

标签: database hibernate jpa

在我的应用程序中工作时,遇到了可能出现Unque Constraints Violation的情况。我有以下选项

  1. 抓住异常并将其重新投放到UI
  2. 在UI上检查异常并显示适当的错误消息
  3. 这是一个不同的想法是在开始整个操作之前提前检查给定Unique值的存在。
  4. 我的问题可能是处理这种情况的最佳做法。目前我们正在使用Struts2 + Spring 3.x + Hibernate 3.x的组合

    提前致谢

    修改

    如果我们决定让数据库给出最终判决,我们将处理异常并将该异常传播到UI,并按照Exception显示Message。您建议应该传播相同的异常(org.hibernate.exception.ConstraintViolationException )到UI层或者我们应该为此创建一个单独的异常类,因为将Hibernate异常传播到UI意味着用Hibernate特定的导入和其他东西污染UI类

2 个答案:

答案 0 :(得分:2)

回答这个问题的最好方法是将其分为两个想法。

1)最终强制执行的唯一约束在哪里?在这种情况下(根据您的问题)答案是数据库。

2)如何通过检查其他地方的约束来改善用户体验?

因为数据库最终会在事务中做出决定,所以没有提前做出有用的检查。即使您在插入之前进行检查,也可能(尽管通常极不可能)另一个用户在检查和实际插入之间及时插入该值。

因此,让数据库决定并将错误重新映射到UI。

请注意,并非所有约束都是如此。在检查小表(例如美国国家或国家或省份的表)的外键时,UI为用户提供选择列表,该列表强制用户选择允许的值。在这种情况下,UI确实强制执行约束。当然,即使在这种情况下,数据库也必须进行最终的强制执行,以防止恶意手工制作的请求,这些请求是针对故意放入无效值的网页层。

因此,对于某些约束,是的,让UI帮助。但是对于独特的约束,UI实际上无法帮助,因为数据库是最终的权限,并且没有有用的检查可以保证在插入时仍然可以保证。

答案 1 :(得分:0)

取决于用户界面以及用户是否可以对其进行任何操作,以及系统中还有其他功能。我通常在尝试插入之前进行检查,特别是如果存在任何类型的事务逻辑,或者在此之后发生其他插入。如果没有这样的东西,并且用户可以只选择一个不同的数字,那么捕获异常并显示错误消息可能就好了。