我有一个像如何处理休眠例外
这是处理一个Hibernate
RuntimeException
正确的地方几个问题。 DAO图层? ServiceLayer?例如,我有
saveCustomer
并且交易失败,我该如何通过Exceptions
通知用户?我正在使用
OpenSessionInView
模式,它只会在呈现视图后才提交事务。在这种情况下,如果交易失败,我该如何告知用户?
我有一个像如何处理休眠例外
这是处理一个Hibernate RuntimeException
正确的地方几个问题。 DAO图层? ServiceLayer?
例如,我有saveCustomer
并且交易失败,我该如何通过Exceptions
通知用户?
我正在使用OpenSessionInView
模式,它只会在呈现视图后才提交事务。在这种情况下,如果交易失败,我该如何告知用户?
一般是处理在你的代码点例外是一个好主意,你必须对如何处理它们(或产生足够的信息,相应的错误消息)的大多数信息。在我开发的j2ee应用程序中,我通常具有一个事务服务层,它将各种DAO调用拼接在一起,并且通常处理特定于休眠的运行时异常以及服务层中的所有其他与数据相关的异常。也就是说,如果DAO中存在一堆可能出现问题的逻辑,那么可能不是一个错误的想法,在那里抓住它,添加一些错误消息上下文,然后重新推出它的链。
如果在事务中发生异常,您可以将其保留为未捕获状态,也可以使用其他上下文重新引发它。这样你的事务管理器知道回滚事务。始终在视图/控制器层中设置一个异常处理程序,以处理从服务层调用中抛出的任何特定于应用程序的运行时异常。检查他们是否有其他错误消息,然后使用它们来适当地通知用户。
据我所知,当一个异常被抛出一个事务时它应该回滚并且根本不会被提交的默认行为。 #2的答案也真的回答了这个问题,也就是说,如果你已经将所有视图层的服务调用包装在try/catch块or configure one globally via your web framework中,那么通知用户发生了什么坏事是不应该有问题的。
这个article (Best Practices for Exception Handling)对异常处理有一个很好的概述,您可能也会发现有用。
捕捉异常,您可以对异常执行某些操作。如果你在DAO层捕获它,那么需要提取dao层特有的信息。例如如果它不能插入空值,则记录字段详细信息失败的位置。一旦完成,那么服务层可以直接或以包装格式对异常进行业务相关处理。你可以看到这些common mistakes in exception handling。这不适用于具体的hibernate example,但一般来说都适用于所有。
太好了。非常感谢。这篇文章真的帮了我。 – barbiegows 2011-05-03 04:17:57