Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Hibernate,Spring,@Transactional-围绕着try/catch?_Java_Hibernate_Spring_Exception_Transactional - Fatal编程技术网

Java Hibernate,Spring,@Transactional-围绕着try/catch?

Java Hibernate,Spring,@Transactional-围绕着try/catch?,java,hibernate,spring,exception,transactional,Java,Hibernate,Spring,Exception,Transactional,我正在用Spring3和Hibernate3.6开发一个Web应用程序。我对@Transactional注释和代码结构有一些问题 ->当我使用@Transactional(使用Spring的事务管理)时,调用@Transactional-注释的方法时是否必须使用try/catch来包围它们 例如,当我得到一个加载、更改并返回一个对象的方法时,我从另一个类调用它:我必须用try/catch来包围调用吗?可能出了问题,没有返回对象,数据库连接失败。。我不知道 到目前为止,我认为@Transactio

我正在用Spring3和Hibernate3.6开发一个Web应用程序。我对
@Transactional
注释和代码结构有一些问题

->当我使用
@Transactional
(使用Spring的事务管理)时,调用
@Transactional
-注释的方法时是否必须使用try/catch来包围它们

例如,当我得到一个加载、更改并返回一个对象的方法时,我从另一个类调用它:我必须用try/catch来包围调用吗?可能出了问题,没有返回对象,数据库连接失败。。我不知道

到目前为止,我认为
@Transactional
关心所有可能发生的异常,并在发生错误时回滚此事务中的每个操作。 但如果发生这种情况,我必须以某种方式通知用户。当我在try块中调用事务方法并回滚它时,catch块被激活了吗? 我可以告诉用户“出了什么问题”。否则可能不会通知用户

或者检查是否有返回的对象(if/else)就足够了,那么我就不需要try/catch了? 我是新来的,我想听听其他人是如何构造他们的代码的。谢谢:-)

在春季使用HandlerExceptionResolver和@ExceptionHandlers非常简单。我倾向于专门使用@ExceptionHandler

您可以使用来处理特定的异常,而不是在try-catch块中自己处理它

如果用户想要找不到的资源,而您想要发送404

@ExceptionHandler(NotFoundException.class)
@ResponseStatus(HttpStatus.NOT_FOUND)
public void handleNotFoundException(NotFoundException exc) {
  // log something.
}
如果服务器出现问题,您希望发送500

@ExceptionHandler(SomeException.class)
public void handleException(SomeException exc, WebRequest request, HttpServletResponse response) {
    response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, "Sorry dude, my server broke");
}

您还应该严格处理异常。一般来说,您不应该执行
@ExceptionHandler(Exception.class)
,我也相信它是按顺序工作的,因此如果您处理了常规异常,它应该是类中的最后一个方法。

Spring使用的关键特性是


依靠异常转换生成您的客户端层理解的异常,如果可能的话,只在那里使用try/catch。

谢谢您的回答。我仔细阅读了链接(spring文档),发现了以下内容:

但是,DAO抛出普通的HibernateException(未选中,因此不必声明或捕获),这意味着调用方只能将异常视为通常是致命的,除非他们希望依赖Hibernate自己的异常层次结构。 如果不将调用者与实现策略联系起来,就不可能捕获特定原因(如乐观锁定失败)。这种折衷可能适用于强烈基于Hibernate和/或不需要任何特殊异常处理的应用程序。”

我的DAO基于普通的Hibernate3API,所以如果我理解正确,我的DAO只抛出普通的HibernateException。它们未经检查,不必申报或捕获。 如果出现问题,则使用@Transactional将回滚整个操作

为了确保一切按我预期的方式工作,我必须将DAO与应用程序代码更紧密地联系起来。例如,我可以在那里检查一个对象是否返回。(如果为空-否则) 我还可以捕获异常,记录它,并通知用户出现了问题,他的事务无法工作

因此,在这一点上,我仍然认为,根据交易: 如果我能处理结果,一切都正常-如果不能,我可以通知用户

当没有指定事务返回结果时,我可以使用try/catch捕捉HibernateException。但当时交易是否仍在回滚?我想,捕获HibernateeException可以避免事务回滚。 我还是不知道该怎么办-(

不幸的是,除此之外,我不明白MVC异常处理(@ExceptionHandler)与此有什么关系。有一个处理过的异常表,但我没有找到HibernateException。
或者您认为它可以与@ExceptionHandler(hibernateeException.classs)一起使用吗?您还说您不建议以这种方式处理异常。

您对代码示例认真吗?不应该像这样吞咽异常。这样代理就没有机会检测到异常并回滚事务。我希望您的意思是:
catch(SomeException exc){抛出新的非法状态异常(exc);}
@Sean这只是伪代码。我希望他不会接受一个例外,除非他有充分的理由这么做。这就是为什么我要问,而不是否决。你应该说清楚,周围有很多新手。谢谢你的回答。第二个伪代码正是我在我的问题中提到的。我不是有意在我的文章中发现一个例外一个事务性方法,但围绕着事务性注释方法的调用。因此答案对我来说并不清楚:我可以这样做,但我不应该这样做?如果事务回滚,我如何通知用户?您可以使用Sean回答中提到的异常转换来生成标准异常(在spring中是DataAccessException或其他什么)并使用@ExceptionHandler捕获异常并通知用户。我更新了答案以显示一个示例。