我有一些代码调用webservice并返回一个ID。我使用hibernate在数据库中保存此ID。我有一个打开会话并提交它的过滤器,当包含的代码中发生任何异常时回滚。由于无法获取Web服务返回的ID,因此如果稍后在代码中发生异常,我希望将其保存在数据库中。无论如何使用相同的会话来做到这一点?
答案 0 :(得分:0)
这取决于谁抛出异常。如果它被hibernate会话对象抛出,你就不能重用会话,如hibernate 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
}
答案 1 :(得分:0)
正确的方法是使用两个交易:一个用于保存ID,另一个用于保存其余的工作。
如果您正在使用EJB,则可以在自己的bean中保存ID,并使用TransactionAttribute
REQUIRES_NEW
对其进行注释。
否则,您可以查看您的环境为您提供的交易的控制权,并找出一种方法来获得两种交易。