如何处理hibernate异常

时间:2011-04-20 04:14:51

标签: java hibernate exception-handling

我有几个问题,比如

  1. 哪个是处理Hibernate RuntimeException的正确位置。 DAO层? ServiceLayer?

  2. 例如,我有saveCustomer且交易失败,如何通过Exceptions通知用户?

  3. 我正在使用OpenSessionInView模式,它只会在呈现视图后提交事务。在这种情况下,如果交易失败,我该如何通知用户?

2 个答案:

答案 0 :(得分:2)

  1. 一般来说,最好在代码中处理异常,以获取有关如何处理异常的最多信息(或生成具有足够信息的相应错误消息)。在我开发的j2ee应用程序中,我通常有一个事务服务层,它将各种DAO调用拼接在一起,我通常在服务层中处理特定于hibernate的运行时异常和所有其他与数据相关的异常。也就是说,如果在DAO中有一堆逻辑可能出错,那么在那里捕获它可能并不是一个坏主意,添加一些错误消息上下文,然后重新抛出链。

  2. 如果您的交易中发生异常,您可以将其保留为未捕获状态,也可以使用其他一些上下文重新抛出异常。这样您的事务管理器就知道要回滚事务。始终在视图/控制器层中设置异常处理程序,以处理从服务层调用中抛出的任何特定于应用程序的运行时异常。检查它们是否有其他错误消息,然后使用它们来适当地通知用户。

  3. 据我所知,当事件抛出异常时它的默认行为应该回滚而根本不会被提交。 #2的答案也真的回答了这个问题,也就是说,如果你在try / catch块or configure one globally via your web framework中包装了所有视图层的服务调用,那么你应该没有问题通知用户错误的地方发生了。

  4. 这个article (Best Practices for Exception Handling)对异常处理有一个很好的概述,你也可以发现它很有用。

答案 1 :(得分:0)

捕获异常,您可以对异常执行某些操作。如果在DAO层中捕获它,则需要提取特定于dao层的信息。例如如果它不能插入空值,则记录失败的字段详细信息。完成后,服务层可以直接或以包装格式进行与业务相关的异常处理。您可以看到这些common mistakes in exception handling。这不适用于特定的hibernate example,但通常适用于所有人。