Ответ 1
Вторая часть операции сопоставления данных saveGroup действительно является поводом для пересмотра дизайна вашего приложения. Сохранение вашей коллекции данных в памяти во временную таблицу, чтобы сравнить ее с сохраненной, чтобы вставлять и удалять дельта, является довольно тяжелой операцией, которая не нужна вообще, если просто нужно изменить имя или описание группы, т.е. когда нет дельт. Независимо от того, может ли это быть, может быть решен сервер базы данных, который является вашим текущим решением или клиентом базы данных, вашим приложением.
Помимо случая, когда группа и, возможно, пользователи нуждаются в первоначальной вставке, если вы хотите, чтобы ваше приложение решало, нужно ли обновлять таблицу ссылок, ваше приложение должно знать, собирает ли коллекция пользователей изменилось с тех пор, как оно было извлечено из базы данных. К сожалению, MyBatis не поможет вашему приложению сделать это.
См., по сравнению с Hibernate MyBatis блаженно не знает о ваших объектах и состоянии, которое они переносят после того, как MyBatis выполнил свое задание, которое является сопоставлением данных, а не сопоставлением отношений объектов. Hibernate может автоматически обнаруживать так называемое грязное состояние ваших объектов, MyBatis не может, так как это никогда не было частью описания работы. Таким образом, вы остаетесь на своих устройствах.
Супер простой подход состоял в том, чтобы сохранить хэш-код пользователя после выбора и проверить, изменился ли этот хэш-код с помощью метода isUserDirty()
. Вы можете просто проверить это условие из вашего сопоставления, используя <if test="isUserDirty">
. Это, конечно, не очень общий подход и зависит от достойной реализации hashCode(). Посмотрите на ответ leonbloy на аналогичный вопрос для более общего подхода. Конечно, это все равно может быть слишком простым, особенно потому, что мы говорим много со многими отношениями. Какой подход лучше всего зависит от вашего дела.
Теперь вы должны знать, что делать. Удачи!
PS вместо того, чтобы вставлять и удалять delta, я бы посоветовал простую перезапись: удалить все, а затем вставить все, в транзакцию. Ваша временная стратегия таблицы - это стратегия оптимизации, которая фактически не может улучшить производительность вашей базы данных вообще, на самом деле я предполагаю, что она, вероятно, еще хуже. Если вы правильно профилировали эту стратегию и знаете, что делаете, вы можете игнорировать эту постскриптум.