Java 强制休眠以保存特定的POJO

Java 强制休眠以保存特定的POJO,java,hibernate,transactions,Java,Hibernate,Transactions,我有一些调用Web服务的代码,它返回一个ID。我正在使用hibernate将这个ID保存在数据库中。我有一个过滤器,它打开会话并提交它,当包含的代码中出现任何异常时回滚。由于无法获取webservice返回的ID,因此我希望将其保存在数据库中,即使代码中稍后出现异常。是否仍然可以使用同一会话执行此操作?这取决于谁引发异常。如果它是由hibernate会话对象抛出的,则无法再重复使用该会话,如hibernate文档中所述: 如果会话引发异常,则必须回滚事务并丢弃会话。异常发生后,会话的内部状态可能

我有一些调用Web服务的代码,它返回一个ID。我正在使用hibernate将这个ID保存在数据库中。我有一个过滤器,它打开会话并提交它,当包含的代码中出现任何异常时回滚。由于无法获取webservice返回的ID,因此我希望将其保存在数据库中,即使代码中稍后出现异常。是否仍然可以使用同一会话执行此操作?

这取决于谁引发异常。如果它是由hibernate会话对象抛出的,则无法再重复使用该会话,如hibernate文档中所述:

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

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

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
}

这取决于谁抛出异常。如果它是由hibernate会话对象抛出的,则无法再重复使用该会话,如hibernate文档中所述:

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

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

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
}

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

如果您使用的是EJB,则可以将ID保存在自己的bean中,并使用的注释对其进行注释


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

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

如果您使用的是EJB,则可以将ID保存在自己的bean中,并使用的注释对其进行注释

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