Форум программистов, компьютерный форум, киберфорум
Java EE (J2EE)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
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
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
02.06.2022, 06:45
Ответы с готовыми решениями:

Каскадное удаление Hibernate
Помогите, пожалуйста разобраться с каскадным удалением hibernate. Есть две сущности: @Entity @Table(name = "grade") ...

Hibernate, каскадное удаление
Добрый день. У меня такая проблема: не могу понять, что делаю не так, перепробовал кучу разных вариантов настройки каскадного удаления...

EJB: если в таблице БД задано каскадное удаление, то в ejb-jar.xml тоже надо его указывать?
Если в базе есть таблица, у которой для одного из полей, которое является foreign key, прописано ON DELETE CASCADE, то в ejb-jar.xml тоже...

8
541 / 352 / 194
Регистрация: 07.11.2018
Сообщений: 1,243
03.06.2022, 12:04
Цитата Сообщение от _ViPeR_ Посмотреть сообщение
удаляет некий элемент;
в модели этого некого элемента должны быть зависимости
Java
1
2
3
4
5
@OneToMany(mappedBy=" некий элемент",
            
            cascade = CascadeType.ALL)
 
private List<Зависимости> зависимости;
если пользователь удаляет некий элемент то он выбирает ид этого элемента и посылает контроллеру

Java
1
2
3
4
5
6
7
8
9
@PostMapping("/delЕлемент")
    public String delЭлемFromDb(@RequestParam Integer selectedId, Model model) {
//Удаляем
        элементRepository.deleteById(selectedId);
//Обновляем список элементов на вьюхе
        Iterable<Элемент> элементе = элемtRepository.findAll();
        model.addAttribute("элем", элементе);
        return "redirect:/delЭлем";
    }
Цитата Сообщение от _ViPeR_ Посмотреть сообщение
. hibernate сначала пытается добавить новый элемент, а потом удалить старый,
Вы же понимаете ,что hibernate это не живое существо.Функция удаления не была вызвана до добавления, либо не отработала правильно.
2
614 / 488 / 175
Регистрация: 02.03.2010
Сообщений: 1,238
07.06.2022, 20:22  [ТС]
Это все хорошо, о чём вы написали, только вот архитектурно проект легаси (2010 год) на MVC даже близко не рассчитывает, spring, с его IOC и прочими фичами тогда ещё зарождался, поэтому вряд ли это мне сможет помочь...
в модели этого некого элемента должны быть зависимости
Что за зависимости? Есть книга, у неё есть набор авторов, в таблице с авторами есть UQ ключ, например по книге и ФИО автора, есть свой суррогатный id, по которому в принципе элемент автора и грузится, что должно быть в модели автора, какие такие зависимости? Там само собой будет ManyToOne на книгу, т.к. у автора только одна книга может быть, авторство в другой книге будет уже другой автор.
Функция удаления не была вызвана до добавления
Вот тут по подробнее, то есть, если я, перебирая то, что придёт от клиента, добавляю в коллекцию новые элементы (без id), а только в конце с помощью retainAll (из Set) оставляю только те, что пришли от клиента, это является проблемой? Hibernate как то слушает хронологию моментов добавления и удаления из коллекции? И, если сначала добавлять, а затем удалять, то в той же последовательности и SQL будут вызываться?
0
541 / 352 / 194
Регистрация: 07.11.2018
Сообщений: 1,243
08.06.2022, 10:52
Цитата Сообщение от _ViPeR_ Посмотреть сообщение
Что за зависимости?
Возможно по русски это как-то по другому называется , в вашем случае это автор и его зависимости это книги .
В таком случае делается составной айдишник. У вас это возможно так: у автора PRIMARY KEY autor.id a его книги PRIMARY KEY book.id autor.id
а так прописана зависимость книги к автору в модэли книги:
Java
1
2
3
4
//bi-directional many-to-one association to Autor
    @ManyToOne(optional=false)
    @JoinColumn(name="autor_id", referencedColumnName="autor_id", insertable=false, updatable=false)
    private Book book;
Так мы при удалении автора должны удалить все его книги из листа...Вообще гадать , что у вас за структура проэкта можно долго, а вы будете говорить угадал ,неугадал.
Цитата Сообщение от _ViPeR_ Посмотреть сообщение
Вот тут по подробнее
Как я могу поподробнее объяснить наугад.Суть ошибки говорит нам , что при добавлении "некого элемента" в базу ,там обнаружен идентичный объект.Как происходит добавление? Как происходит сравнение ? Как происходит удаление?
Я вам показал как у меня в проэкте происходит удаление элемента со всеми зависимостями.
Возможно у вас неправильная генерация айдишника книги
Java
1
2
3
4
@Id
    @Column(name="book_id")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
     private int book_id;
Добавлено через 33 минуты
Цитата Сообщение от _ViPeR_ Посмотреть сообщение
Там само собой будет ManyToOne на книгу, т.к. у автора только одна книга может быть, авторство в другой книге будет уже другой автор.
Хм..Наоборот ..У автора много книг , это у книги один автор.Хотя в редких случаях может быть несколько авторов тогда делается как вы сказали суррогатный 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  [ТС]
Цитата Сообщение от DimaxDe Посмотреть сообщение
Хм..Наоборот ..У автора много книг , это у книги один автор.Хотя в редких случаях может быть несколько авторов тогда делается как вы сказали суррогатный id.Если это то ,что я думаю.Т.е делается промежуточная таблица автор_книга
Вот именно, что у человека (как писателя например) может быть несколько книг, под "автором книги" я понимаю как раз вот эту связку, как вы назвали "автор_книга", т.к. помимо FK на книгу и человека в этом объекте есть ещё куча других полей (позиция, категория и пр.).
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
Цитата Сообщение от _ViPeR_ Посмотреть сообщение
Если этот ID с клиент не передан, сервер считает, что это новый объект
Есть в скуле функция нот ин..Чтобы сервер не считал ,что это новый объект если он есть уже.

Добавлено через 4 минуты
Цитата Сообщение от _ViPeR_ Посмотреть сообщение
Пользователь открыл книгу на редактирование - видит там есть автор "Иванов Иван Иванович", он берет и удаляет его
функционал удаления автора должен повлечь удаление всех его книг,если вы пишите
Цитата Сообщение от _ViPeR_ Посмотреть сообщение
открыл книгу на редактирование
тогда и редактируйте апдэйтом,почему удаляете?
0
614 / 488 / 175
Регистрация: 02.03.2010
Сообщений: 1,238
14.06.2022, 18:34  [ТС]
Вы меня тролите или я реально недостаточно понятно описываю ситуацию?
Цитата Сообщение от DimaxDe Посмотреть сообщение
Есть в скуле функция нот ин..
Причём тут скул и его функции?
Цитата Сообщение от DimaxDe Посмотреть сообщение
функционал удаления автора должен повлечь удаление всех его книг,если вы пишите
Это что за жесть? Если пользователь хочет удалить информацию о том, что Иванов И.И. является автором, например книги 1, зачем удалять книгу 2, в которой этот же Иванов И.И. так же является автором, книга 2 в этот момент вообще не причем.
Цитата Сообщение от DimaxDe Посмотреть сообщение
тогда и редактируйте апдэйтом,почему удаляете?
Книга редактируется, никуда не девается, удаляется информация о том, что та или иная персона больше не автор.
0
541 / 352 / 194
Регистрация: 07.11.2018
Сообщений: 1,243
15.06.2022, 09:49
Цитата Сообщение от _ViPeR_ Посмотреть сообщение
Причём тут скул и его функции?
у вас ошибка какая?
Цитата Сообщение от _ViPeR_ Посмотреть сообщение
MySQLIntegrityConstraintViolationExcepti on "Duplicate entry".
Цитата Сообщение от _ViPeR_ Посмотреть сообщение
Это что за жесть?
ладно не буду жестить.Вы понимаете принципы баз данных, и сами разберётесь.
Цитата Сообщение от _ViPeR_ Посмотреть сообщение
Книга редактируется, никуда не девается, удаляется информация о том,
Это говорит о том ,что вы не понимаете основ .

Добавлено через 2 минуты
интерестно
0
614 / 488 / 175
Регистрация: 02.03.2010
Сообщений: 1,238
15.06.2022, 20:16  [ТС]
Цитата Сообщение от DimaxDe Посмотреть сообщение
у вас ошибка какая?
Мне качать исходники hibernate, переписывать его код, компилить и использовать кастомную версию, в которой будет вручную решаться вышеуказанная проблема?
Цитата Сообщение от DimaxDe Посмотреть сообщение
ладно не буду жестить.Вы понимаете принципы баз данных, и сами разберётесь.
Спасибо, ваша помощь крайне неоценима!
Цитата Сообщение от DimaxDe Посмотреть сообщение
Это говорит о том ,что вы не понимаете основ .
Это тоже мне очень помогло...
Цитата Сообщение от DimaxDe Посмотреть сообщение
интерестно
А это, просто шедевр!
Не зря я уже пару лет не заходил на этот форум, ситуация тут только усугубляется...

Думаю, что в силу отсутствия желания у местного комьюнити оказания по мере знаний и возможности помочь другим (как это было раньше, как это старался делать я), смысл в дальнейшей дискуссии пропадает... Тему можно закрыть.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
15.06.2022, 20:16
Помогаю со студенческими работами здесь

Выделить первую строку в таблице, в которой есть значения
Как выделить первую строку в таблице, в которой есть значения? (то есть выделить названия колонок в таблице) по идее должно быть вот так:...

Макрос для удаление строки, в которой отсутствуют заданные слова в таблице Word
Здравствуйте. Появилась необходимость автоматизированной обработки таблиц в Word. Суть: Есть файл Word (см. приложения) внутри которого...

Hibernate и коллекции
Разбираюсь с Hibernate. Возникла сложность : есть у меня Task и TaskList . Мне нужно с TaskList-а получить список Task-ов . Не могу понять...

Можно ли узнать, какие UNIQUE в таблице?
Для создания UNIQUE используются запросы типа: ALTER TABLE kattov ADD UNIQUE (guid) ALTER TABLE kattov ADD UNIQUE (producer, artikul) ...

Не происходит каскадное обновление в Таблице
В таблицу &quot;Должность&quot; внесена новая должность &quot;Главный специалист&quot; (Под кодом - 8). В таблице &quot;Должность_Разрешения&quot;, в столбце...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Модульный подход на примере 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 позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru