|
614 / 488 / 175
Регистрация: 02.03.2010
Сообщений: 1,238
|
|
Hibernate и каскадное удаление из коллекции в таблице БД которой есть unique индекс02.06.2022, 06:45. Показов 1129. Ответов 8
Ситуация в целом описана в теме.
Более подробно - есть, например таблица, в которой хранится коллекция OneToMany каких-нибудь элементов и есть в этой таблице уникальный индекс по каким-нибудь полям. Пока пользователи всё делают адекватно, все пучком, но стоит им сделать финт ушами, как вываливается MySQLIntegrityConstraintViolationExcepti on. Под "финтом ушами" понимается такой кейс: - пользователь из списка удаляет некий элемент; - пользователь в список добавляет новый элемент, с абсолютно теми же значениями ключевых (для uq индекса) полей. В итоге hibernate по cascade из Set удаляет удалённый пользователем элемент и создает новый с такими же значениями uq индекса, как итог в момент commit сессии - MySQLIntegrityConstraintViolationExcepti on "Duplicate entry". Т.е. hibernate сначала пытается добавить новый элемент, а потом удалить старый, а хотелось бы наоборот. P.S. Версия hibernate 4.3.11.Final. Заранее спасибо за любую помощь.
0
|
|
| 02.06.2022, 06:45 | |
|
Ответы с готовыми решениями:
8
Каскадное удаление Hibernate Hibernate, каскадное удаление EJB: если в таблице БД задано каскадное удаление, то в ejb-jar.xml тоже надо его указывать? |
|
541 / 352 / 194
Регистрация: 07.11.2018
Сообщений: 1,243
|
|||||||||||||
| 03.06.2022, 12:04 | |||||||||||||
2
|
|||||||||||||
|
614 / 488 / 175
Регистрация: 02.03.2010
Сообщений: 1,238
|
|||
| 07.06.2022, 20:22 [ТС] | |||
|
Это все хорошо, о чём вы написали, только вот архитектурно проект легаси (2010 год) на MVC даже близко не рассчитывает, spring, с его IOC и прочими фичами тогда ещё зарождался, поэтому вряд ли это мне сможет помочь...
0
|
|||
|
541 / 352 / 194
Регистрация: 07.11.2018
Сообщений: 1,243
|
||||||||||||||
| 08.06.2022, 10:52 | ||||||||||||||
|
В таком случае делается составной айдишник. У вас это возможно так: у автора PRIMARY KEY autor.id a его книги PRIMARY KEY book.id autor.id а так прописана зависимость книги к автору в модэли книги:
Я вам показал как у меня в проэкте происходит удаление элемента со всеми зависимостями. Возможно у вас неправильная генерация айдишника книги
у неё есть свой айди PRIMARY KEY autor_book_id и 2 вторичных FOREIGN KEY autor_id FOREIGN KEY book_id и тогда уже удаление автора должно повлеч за собой удаление только тех книг ,где он является единственным автором.Хм..но также нельзя удалять автора если он является соавтором в какой нибудь книге.Какова структура вашей базы?
0
|
||||||||||||||
|
614 / 488 / 175
Регистрация: 02.03.2010
Сообщений: 1,238
|
||
| 12.06.2022, 11:17 [ТС] | ||
|
ID у всех таблиц суррогатные, обычные автоинкрементные int. Вот именно по этим int'ам происходит загрузка из сессии нужно объекта. Если этот ID с клиент не передан, сервер считает, что это новый объект, и вот здесь весь смысл, который я пытаюсь выталковать. Представим, что UQ ключ в этой таблице "автор_книга" состоит из 2х полей - книга и человек (оба FK на другие таблицы). Теперь ситуация, как я описал в первом сообщении: - Пользователь открыл книгу на редактирование - видит там есть автор "Иванов Иван Иванович", он берет и удаляет его, клиент удаляет у себя объект, информация о ID для "автор_книга", который был получен при загрузке, клиент теряет. - Пользователь такой думает, блин, зря удалил, берет и добавляет человека "Иванов Иван Иванович" снова. У вновь добавленного объекта ID пуст, клиент его само собой ещё не знает, т.к. он будет сгенерирован в БД только в момент сохранения всей книги (всё сохраняется кучей, а не по отдельности). - Пользователь отправляет команду сохранения всей книги. - На сервере перебирается пришедший в запросе с клиента массив данных, этот массив map'ится в HashSet<автор_книга> - т.е. сюда валятся все "авторы_книги", и созданные новые (пришедшие без ID) и загруженные из сессии (пришедшие с ID). - Из книги берется OneToMany HashSet<"автор_книга"> и тут по сути 2 варианта встречается в коде: -- Первый вариант - в процессе map'инга, пришедших с клиента данных в объекты "авторы_книги", если "автор_книги" без ID и создается новый, то он тут же добавляется во взятый из книги OneToMany HashSet<"автор_книга">. После окончания перебора всех пришедших с клиента "авторов_книги", у OneToMany HashSet'а<"автор_книга"> вызывается просто retainAll(полученный с клиента HashSet<"автор_книга">), что бы удалить имеющихся в книге "авторов_книга", которые на клиенте были безвозвратно удалены. -- Второй вариант - делается в принципе тоже самое, только, если "автор_книги" без ID и создается новый, то он не добавляется во взятый из книги OneToMany HashSet<"автор_книга">, а в конце перебора всех пришедших с клиента "авторов_книги" вызывается addAll и retainAll. Вот, понятней я вряд ли смогу объяснить... Ну вот в этом случае JDBC драйвер MySQL и бросает MySQLIntegrityConstraintViolationExcepti on, т.е. Hibernate сначала отправляет запрос на создание новых "авторов_книги", а потом "думает", удалю каскадно, удалённые из Set'а, но JDBC его обламывает, т.к. "Иванов Иван Иванович" как автор книги уже есть в таблице, а тут ещё одного пытаются добавить, хоть и планируют удалить старого потом.
0
|
||
|
541 / 352 / 194
Регистрация: 07.11.2018
Сообщений: 1,243
|
||||
| 14.06.2022, 10:53 | ||||
|
Добавлено через 4 минуты
0
|
||||
|
614 / 488 / 175
Регистрация: 02.03.2010
Сообщений: 1,238
|
||||
| 14.06.2022, 18:34 [ТС] | ||||
|
Вы меня тролите или я реально недостаточно понятно описываю ситуацию?
0
|
||||
|
541 / 352 / 194
Регистрация: 07.11.2018
Сообщений: 1,243
|
|||||
| 15.06.2022, 09:49 | |||||
|
Добавлено через 2 минуты интерестно
0
|
|||||
|
614 / 488 / 175
Регистрация: 02.03.2010
Сообщений: 1,238
|
|||||
| 15.06.2022, 20:16 [ТС] | |||||
|
Не зря я уже пару лет не заходил на этот форум, ситуация тут только усугубляется... Думаю, что в силу отсутствия желания у местного комьюнити оказания по мере знаний и возможности помочь другим (как это было раньше, как это старался делать я), смысл в дальнейшей дискуссии пропадает... Тему можно закрыть.
0
|
|||||
| 15.06.2022, 20:16 | |
|
Помогаю со студенческими работами здесь
9
Выделить первую строку в таблице, в которой есть значения Макрос для удаление строки, в которой отсутствуют заданные слова в таблице Word Hibernate и коллекции Можно ли узнать, какие UNIQUE в таблице? Не происходит каскадное обновление в Таблице Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение:
В этой книге («Подход, основанный на вариантах использования») Ивар утверждает,
что архитектура программного обеспечения — это
структуры,. . .
|
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога
Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
|
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога
Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip
На первой гифке отладочные линии отключены, а на второй включены:. . .
|
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога
Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем.
. . .
|
|
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
|
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
|
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
|
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога
Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
|