强制休眠以保存特定的POJO

时间:2012-09-24 21:16:47

标签: java hibernate transactions

我有一些代码调用webservice并返回一个ID。我使用hibernate在数据库中保存此ID。我有一个打开会话并提交它的过滤器,当包含的代码中发生任何异常时回滚。由于无法获取Web服务返回的ID,因此如果稍后在代码中发生异常,我希望将其保存在数据库中。无论如何使用相同的会话来做到这一点?

2 个答案:

答案 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对其进行注释。

否则,您可以查看您的环境为您提供的交易的控制权,并找出一种方法来获得两种交易。