我有一些调用 web 服务的代码,它返回一个 ID。我正在使用休眠将此 ID 保存在数据库中。我有一个过滤器,可以打开会话并提交它,当包含的代码中发生任何异常时回滚。由于无法取回 Web 服务返回的 ID,我想将其保存在数据库中,即使稍后在代码中发生异常也是如此。反正有没有使用相同的会话来做到这一点?
问问题
421 次
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 中,并使用TransactionAttribute
of注释它REQUIRES_NEW
。
否则,您可以查看您的环境为您提供的对事务的控制,并找出一种方法来拥有其中的两个。
于 2012-09-24T21:59:57.047 回答