Если вы создаете новую транзакцию (session.beginTransaction();
), то создается новое соединение с БД. Итак, у вас есть транзакция с блокировкой чтения на stats
(из цикла for
), и внутри нее вы пытаетесь записать в ту же строку -> Deadlock.
Чтобы исправить это, вы сначала выбираете все StatUser
s со вторым циклом, закрываете первую транзакцию, а затем перебираете результат в приведенном выше коде. Если вы не можете сделать это из-за недостатка памяти, Hibernate больше не ваш друг, и вы должны использовать пользовательский SQL.
Другие решения: используйте оптимистическую блокировку или прочитайте данные, которые будут изменены с помощью пользовательского SQL, и создайте экземпляры объектов в цикле.