Java 强制休眠以保存特定的POJO
我有一些调用Web服务的代码,它返回一个ID。我正在使用hibernate将这个ID保存在数据库中。我有一个过滤器,它打开会话并提交它,当包含的代码中出现任何异常时回滚。由于无法获取webservice返回的ID,因此我希望将其保存在数据库中,即使代码中稍后出现异常。是否仍然可以使用同一会话执行此操作?这取决于谁引发异常。如果它是由hibernate会话对象抛出的,则无法再重复使用该会话,如hibernate文档中所述: 如果会话引发异常,则必须回滚事务并丢弃会话。异常发生后,会话的内部状态可能与数据库不一致 如果异常是由其他代码引发的,那么是的,您可以执行以下操作:Java 强制休眠以保存特定的POJO,java,hibernate,transactions,Java,Hibernate,Transactions,我有一些调用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中,并使用的注释对其进行注释 否则,您可以查看您的环境为您提供了对事务的控制,并找到一种方法来拥有其中的两个事务