Не уверен, возможно ли это конкретно для ваших данных, но я смог решить проблему с помощью набора вместо списка только для сопоставленных коллекций, с которыми у меня возникли проблемы.
Я заметил, что многие обвиняют Джексона в этом вопросе. Хотя, в моем случае, я заметил, что установка FetchType в Lazy устранила проблему без необходимости изменять тип Collection.
Полагаю, это не поможет вашей ситуации, так как вам все равно нужно создавать экземпляры всех этих полей, и в этом случае ленивая загрузка будет бесполезной.
Тем не менее, вы можете захотеть взглянуть на все места в вашем коде, в которых вы создаете экземпляры объектов с ассоциациями с другими объектами, и проверить, не создаются ли какие-либо дополнительные объекты с нетерпением.
Ваш метод equals (), похоже, полностью соответствует передовому опыту. Хотя, на самом деле, я не уверен, что вы создаете там объект User, и в этом случае, как побочный эффект, связанные объекты User будут созданы с энтузиазмом.
Я могу быть ужасно неправ в этом (извините, в данный момент я не могу проверить), но вы можете следить за подобными сценариями, если вы застряли и не можете ни использовать ленивую загрузку, ни выбирать «Наборы над списками» в проблемные случаи.