Если я хочу использовать фиксацию (сеанс) после успешного выполнения операции с базой данных, где ее лучше положить в try или в finally block? Здесь я использовал его, в конце концов, должен ли он попробовать?
public void delete( --- ) {
Session session = init();
try {
----
} catch (HibernateException e) {
rollback(session);
logger.error("delete failed", e);
throw e;
} finally {
commit(session);
close(session);
}
}
Это должно быть в try
, по двум причинам:
commit
сеанс, если какое-либо исключение или ошибка, кроме исключения HibernateException
, и вы почти наверняка не хотите этого делатьcommit
после вызова rollback
. Я не могу вспомнить, позволяет ли Hibernate сделать это (молча игнорируя откат), но, по крайней мере, это уродливо. Каждая сессия должна быть зафиксирована или отменена. Нормальное решение здесь, чтобы сохранить отдельную boolean
переменную, которая устанавливается, когда вы успешно совершить, и убедитесь, что в finally
, откат в случае необходимости:
boolean committed = false;
try {
// Do stuff
commit(session);
committed = true;
} catch (HibernateException e) {
logger.error("delete failed", e);
throw e;
} finally {
if (!committed) {
rollback(session);
}
// TODO: This won't execute if rollback fails.
// Check whether that a problem.
close(session);
}
Это должно быть в try
. finally
будет также вызван после catch
.
Он должен определенно быть помещен в блок try. Окончательный блок используется только для закрытия любого соединения.
вам нужно поместить его в блок try, иначе вы не узнаете никаких ошибок, и вы не сможете откатить