Убедитесь, что вы всегда фиксируете или откатываете, а затем всегда закрываете сеанс. По сути, ваши ресурсы (транзакция и сеанс) должны быть освобождены независимо от того, что, например, они могут быть размещены внутри соответствующего блока finally (в случае сеанса) или в обоих блоках try и catch (в случае транзакции).
Как правило, распределение и освобождение ресурсов между различными уровнями приложений - это анти-паттерн - если ваша архитектура заставляет вас применять анти-паттерн, тогда есть еще вопросы, которые можно задать здесь ... Например, подумайте, что вы должны делать в вашем "фильтре", если сессия будет закрыта ...