2

我有一些调用 web 服务的代码,它返回一个 ID。我正在使用休眠将此 ID 保存在数据库中。我有一个过滤器,可以打开会话并提交它,当包含的代码中发生任何异常时回滚。由于无法取回 Web 服务返回的 ID,我想将其保存在数据库中,即使稍后在代码中发生异常也是如此。反正有没有使用相同的会话来做到这一点?

4

2 回答 2

0

这取决于谁抛出异常。如果它是由休眠会话对象抛出的,则您不能再重用会话,如休眠会话文档中所述:

如果 Session 抛出异常,则必须回滚事务并丢弃会话。异常发生后,Session的内部状态可能与数据库不一致。

如果异常是由其他代码引发的,那么是的,您可以执行以下操作:

Long yourIdFromWebservice = ...

try {
   // do some processing that might result in an exception
}
catch(//the interesting exception, but not HibernateException) {
     //maybe log it, rethrow it
}
finally {
   session.save() //save what needed to be saved
}

或根据您的用例:

try {
   // do some processing that might result in an exception
   session.save() //save all stuff if no exception
}
catch(//the interesting exception, but not HibernateException) {
     session.save() //save only the id from the webservice
}
于 2012-09-24T21:35:45.423 回答
0

正确的做法是使用两个事务:一个保存 ID,另一个保存您的其余工作。

如果您使用的是 EJB,您可以将 ID 保存在它自己的 bean 中,并使用TransactionAttributeof注释它REQUIRES_NEW

否则,您可以查看您的环境为您提供的对事务的控制,并找出一种方法来拥有其中的两个。

于 2012-09-24T21:59:57.047 回答