java - 如何处理hibernate异常

标签 java hibernate exception

我有几个问题,比如

  1. 这是处理 Hibernate RuntimeException 的正确位置。 DAO 层? 服务层?

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

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

最佳答案

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

  2. 如果事务中发生异常,您可以不捕获它,也可以使用一些附加上下文重新抛出它。这样你的事务管理器就知道要回滚事务。始终在 View / Controller 层中设置异常处理程序,以处理从服务层调用引发的任何特定于应用程序的运行时异常。检查它们是否有其他错误消息,然后使用它们适本地通知用户。

  3. 据我所知,当事务抛出异常时,默认行为应该回滚并且根本不提交。 #2 的答案确实也回答了这个问题,即,如果您已将所有 View 层的服务调用包装在 try/catch block 中 or configure one globally via your web framework通知用户发生了严重错误的事情应该不会有问题。

这个article (Best Practices for Exception Handling)对一般异常处理有一个不错的概述,您可能也会觉得有用。

关于java - 如何处理hibernate异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5725419/

相关文章:

java - JBoss hibernate : Could not load requested class com. mysql.jdbc.Driver

scala - Apache Spark : dealing with Option/Some/None in RDDs

java - 找出重复字母最多的单词

java - 在 lambda 中工作的方法引用分配

Java - 如果没有 flush() 和 close(),ByteArrayOutputStream 是否安全?

c# - 返回 bool 值并重新抛出异常

c# - Database.ExecuteSqlCommand - 捕获 SQL 异常

java - 为什么我不能在 Java 中传递这样的数组

java - HIbernate JPA与javassist.util.proxy.Proxy不兼容导致

java - 将列表作为值插入映射中