Проблема в том, что ваш код обрабатывает исключение, что является плохим или плохим делом в 99,9% случаев, и происходит следующее:
Одно из взаимодействий с сеансом завершается неудачно в блоке try и выдает исключение. Когда это происходит, сеанс становится недействительным и не может использоваться для абсолютно ничего , поскольку он находится в несогласованном состоянии. Но ваш код взаимодействует с сеансом в блоке catch, который вызывает утверждение.
Единственная безопасная вещь, которую нужно сделать после исключения из сеанса, - откатить транзакцию и закрыть ее. Любой другой тип взаимодействия, вероятно, будет генерировать другое исключение (в данном случае исключение утверждения).