|
|
|
JPA CASCADE
|
|||
|---|---|---|---|
|
#18+
Код: java 1. 2. 3. 4. 5. Как добавить логику, если например удаляется 2 OtherEntity если используется Cascade? Т.е. в сервис приходит Entity с уже двумя удаленными OtherEntity, как в таком случае это обработать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.08.2016, 13:53 |
|
||
|
JPA CASCADE
|
|||
|---|---|---|---|
|
#18+
Если ты в объекте Entity удалил 2 OtherEntity, потом делаешь flush или commit своим EntityManager, то все, тех самых 2 OtherEntity не будет ни в памяти приложения ни в БД. После этого передаешь объект Entity в какой-нибудь сервис и не увидишь больше своих удаленных элементов в коллекции. Или я не понял твоей проблемы? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.08.2016, 14:02 |
|
||
|
JPA CASCADE
|
|||
|---|---|---|---|
|
#18+
Паша01, Допустим мне при удалении 2х ентити надо отправить емэйл ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.08.2016, 14:05 |
|
||
|
JPA CASCADE
|
|||
|---|---|---|---|
|
#18+
no56892в сервис приходит Entity с уже двумя удаленными OtherEntity кем и где удалёнными? Тип каскада - все. Значит ВСЕ операции, в том числе с БД отслеживает маппинг и потом реализует. Если объекты вне сессии напр. хибера, то их надо аттачить к сессии. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.08.2016, 14:05 |
|
||
|
JPA CASCADE
|
|||
|---|---|---|---|
|
#18+
Может так понятнее будет: Код: java 1. 2. 3. 4. 5. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.08.2016, 14:09 |
|
||
|
JPA CASCADE
|
|||
|---|---|---|---|
|
#18+
Так напиши свой метод removeAndSendEmails() внутри класса Entity и вызывай для удаления только его ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.08.2016, 14:11 |
|
||
|
JPA CASCADE
|
|||
|---|---|---|---|
|
#18+
Неправильно выразился. Напиши этот метод removeAndSendEmails() внутри какого-то сервиса. В нем сначала удали, а потом отправь емейл. Просто замени вызовы other.remove() на entityService.removeAndSendEmails() ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.08.2016, 14:13 |
|
||
|
JPA CASCADE
|
|||
|---|---|---|---|
|
#18+
Или можешь использовать ListChangeListener. Повесь его на свою коллекцию. Внутри слушателя увидишь, если произошло удаление, то отправляй емейл ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.08.2016, 14:14 |
|
||
|
JPA CASCADE
|
|||
|---|---|---|---|
|
#18+
no56892Допустим мне при удалении 2х ентити надо отправить емэйл @PostPersist ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.08.2016, 14:14 |
|
||
|
JPA CASCADE
|
|||
|---|---|---|---|
|
#18+
Там большой граф с Ентити, и помимо удаления 2х объектов Юзер еще много чего модифицирует. Как ты предлагаешь это не подходит, т.к. не будет сделано в одной транзакции раз и ты предлагаешь удалить CASCADE два. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.08.2016, 14:15 |
|
||
|
JPA CASCADE
|
|||
|---|---|---|---|
|
#18+
Petro123no56892Допустим мне при удалении 2х ентити надо отправить емэйл @PostPersist ? Тогда уж @PostRemove - Executed after the entity manager remove operation is actually executed or cascaded. This call is synchronous with the remove operation. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.08.2016, 14:16 |
|
||
|
JPA CASCADE
|
|||
|---|---|---|---|
|
#18+
Petro123no56892Допустим мне при удалении 2х ентити надо отправить емэйл @PostPersist ? Здорово, но как я узнаю что удалилось 2 Ентити? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.08.2016, 14:17 |
|
||
|
JPA CASCADE
|
|||
|---|---|---|---|
|
#18+
no56892Здорово, но как я узнаю что удалилось 2 Ентити? нет логики. Что значит 2? Это сакральное число? Тогда это бизнес-логика и делать нужно по другому. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.08.2016, 14:20 |
|
||
|
JPA CASCADE
|
|||
|---|---|---|---|
|
#18+
Petro123, вообще, нельзя на триггеры в кавычках нагружать отправку по мылу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.08.2016, 14:21 |
|
||
|
JPA CASCADE
|
|||
|---|---|---|---|
|
#18+
С такой логикой подходит лучше всего ListChangeListener. В нем ты можешь увидеть, что удалилось именно 2 элемента. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.08.2016, 14:22 |
|
||
|
JPA CASCADE
|
|||
|---|---|---|---|
|
#18+
Petro123, Как, кроме как руками все разбирать и забить на Cascade? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.08.2016, 14:22 |
|
||
|
JPA CASCADE
|
|||
|---|---|---|---|
|
#18+
Паша01С такой логикой подходит лучше всего ListChangeListener. В нем ты можешь увидеть, что удалилось именно 2 элемента. Хибернейт свои коллекции использует. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.08.2016, 14:26 |
|
||
|
JPA CASCADE
|
|||
|---|---|---|---|
|
#18+
no56892Petro123, Как, кроме как руками все разбирать и забить на Cascade? не могу ответить когда постановка странная). Что за число 2 и кто создал проблему с этим числом? Если нужно отправлять мыло только при выписке из квартиры двоих, то проверять надо в сервисном слое где происходит выписка. Модель данных, маппинг и каскад ни при чём. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.08.2016, 14:29 |
|
||
|
JPA CASCADE
|
|||
|---|---|---|---|
|
#18+
Паша01что удалилось именно 2 элемента. можно в триггере Код: java 1. 2. )))) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.08.2016, 14:31 |
|
||
|
JPA CASCADE
|
|||
|---|---|---|---|
|
#18+
no56892, там много чего есть: Код: java 1. Ещё есть контекст. Посмотри что там можно посчитать про "2". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.08.2016, 14:36 |
|
||
|
JPA CASCADE
|
|||
|---|---|---|---|
|
#18+
no56892Паша01С такой логикой подходит лучше всего ListChangeListener. В нем ты можешь увидеть, что удалилось именно 2 элемента. Хибернейт свои коллекции использует. Когда я юзал Eclipse Rap фреймворк, в котором использовались такие слушатели, то я мог взять объект Entity и в любом месте в приложении повесить на его поле Set<OtherEntity> others слушатель. И в слушателе делал, что мне надо было. Ты сказал, твои объекты Entity юзаются в каком-то графе. Если ты погуглишь, наверняка найдешь примеры таких слушателей и у тебя будет код выглядеть примерно как я описал ниже. И станет совсем неважно, что Хибернейт свои коллекции использует. public void addEntityToGraph(Entity en, Graph graph) { ObservableSet obsvSet = BeanProperies.observeSet(Entity.class, "others", typeOfOthers) obsvSet.addValueChangeListener(new ValueChangeListener(Event diff) { diff.newValue... }); } ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.08.2016, 14:40 |
|
||
|
JPA CASCADE
|
|||
|---|---|---|---|
|
#18+
Да и вообще гугл меня приводит к http://www.glazedlists.com/ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.08.2016, 14:42 |
|
||
|
JPA CASCADE
|
|||
|---|---|---|---|
|
#18+
Паша01и в любом месте в приложении повесить на его поле а если юзверь просто играется с коллекцией? Т.е. коммит - сохранить не нажимал, а идёт по мастеру страничкам в одной сессии. Тогда зазря уйдёт по мылу сообщение об удалении 2-х объектов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.08.2016, 15:03 |
|
||
|
JPA CASCADE
|
|||
|---|---|---|---|
|
#18+
Petro123Паша01и в любом месте в приложении повесить на его поле а если юзверь просто играется с коллекцией? Т.е. коммит - сохранить не нажимал, а идёт по мастеру страничкам в одной сессии. Тогда зазря уйдёт по мылу сообщение об удалении 2-х объектов. Слушай, ты может сразу все расскажешь? Судя по твоему комментарию, ты банально можешь добавить поле oldOthersSize в Entity. Код: java 1. 2. 3. 4. 5. 6. 7. 8. Инициализируей его перед тем, как добавить объект Entity в свой граф. Когда юзер нажимает кнопку Сохранить, тупо сравниваешь размер текущей коллекции с переменной oldOthersSize. И все. Вот так легко узнаешь, что удалилось именно 2 элемента. Решение может и не верх элегантности, но реализуется максимум за 5 минут. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.08.2016, 15:14 |
|
||
|
JPA CASCADE
|
|||
|---|---|---|---|
|
#18+
Или ещё 2-ой вариант, более универсальный. Если ты удалил 2 элемента коллекции others, и сохранишь это, то для объекта Entity ВРОДЕ КАК должна сработать конструкция @PostUpdate. И в нем с помощью все той же переменной oldOthersSize из примера выше узнаешь, что удалилось 2 элемента. Вот только я точно не знаю, сработает ли @PostUpdate в такой ситуации. Возьми проверь ))) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.08.2016, 15:21 |
|
||
|
JPA CASCADE
|
|||
|---|---|---|---|
|
#18+
Паша01Слушай, ты может сразу все расскажешь? не. Я сам размышляю что лучше, что хуже. Нет однозначности). Да и постановка странная. Паша01Решение может и не верх элегантности, но реализуется максимум за 5 минут. да. +1 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.08.2016, 15:23 |
|
||
|
JPA CASCADE
|
|||
|---|---|---|---|
|
#18+
Паша01И в нем с помощью все той же переменной oldOthersSize +1 ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.08.2016, 15:25 |
|
||
|
JPA CASCADE
|
|||
|---|---|---|---|
|
#18+
Petro123, Хаха, мне показалось, что это он написал, ник не посмотрел ))) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.08.2016, 15:39 |
|
||
|
JPA CASCADE
|
|||
|---|---|---|---|
|
#18+
Паша01Petro123пропущено... а если юзверь просто играется с коллекцией? Т.е. коммит - сохранить не нажимал, а идёт по мастеру страничкам в одной сессии. Тогда зазря уйдёт по мылу сообщение об удалении 2-х объектов. Слушай, ты может сразу все расскажешь? Судя по твоему комментарию, ты банально можешь добавить поле oldOthersSize в Entity. Код: java 1. 2. 3. 4. 5. 6. 7. 8. Инициализируей его перед тем, как добавить объект Entity в свой граф. Когда юзер нажимает кнопку Сохранить, тупо сравниваешь размер текущей коллекции с переменной oldOthersSize. И все. Вот так легко узнаешь, что удалилось именно 2 элемента. Решение может и не верх элегантности, но реализуется максимум за 5 минут. Это уродство))) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.08.2016, 16:16 |
|
||
|
JPA CASCADE
|
|||
|---|---|---|---|
|
#18+
no56892Это уродство))) Когда костыль является единственным решением, он становится эталонным))) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.08.2016, 16:23 |
|
||
|
JPA CASCADE
|
|||
|---|---|---|---|
|
#18+
Оно не единственное, похоже придется при мердже сначала вытаскивать из базы еще раз и сравнивать ручками расхождения в списках. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.08.2016, 16:32 |
|
||
|
JPA CASCADE
|
|||
|---|---|---|---|
|
#18+
no56892Это уродство))) какая постановка, такое и решение). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.08.2016, 16:33 |
|
||
|
JPA CASCADE
|
|||
|---|---|---|---|
|
#18+
no56892вытаскивать из базы еще раз сессии разные. Что с чем сравнивать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.08.2016, 16:34 |
|
||
|
JPA CASCADE
|
|||
|---|---|---|---|
|
#18+
Petro123, Какая разница то. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.08.2016, 16:38 |
|
||
|
JPA CASCADE
|
|||
|---|---|---|---|
|
#18+
no56892Petro123, Какая разница то. мы пока гадаем что означает цифра 2. 1. Например, в соседней сессии параллельно юзверь из 4-х чилдрен сделал 3. А ты тут перечитываешь из базы где тоже одну удалил. 2. У хибера механизм версии сущности тоже точно такой же. Есть поле версия и мы потом сохраняя сверяемся с базой. Код: java 1. 2. 3. 4. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.08.2016, 16:58 |
|
||
|
JPA CASCADE
|
|||
|---|---|---|---|
|
#18+
Petro123и мы потом сохраняя сверяемся с базой. вернее не мы, а хибер. Нам "нельзя" этот счётчик трогать. Т.е. Паша01 вроде здраво предложил. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.08.2016, 17:00 |
|
||
|
JPA CASCADE
|
|||
|---|---|---|---|
|
#18+
Petro123, 1.Юзер вытащил с 4мя чайлдами. Сессия закрыта. 2.Юзер удалил (снял 2 чекбокса например) 2 чайлда в своем локальном графе. 3.Кто-то в это время из базы удалил 1 чайлда, т.е. по факту в базе сейчас уже 3, а не 4. 4.Юзер нажимает сейв. 4.1. Вытаскиваем из базы свежий список и видим что там 3. 4.2. разница != 2 => следовательно ничего не делаем, просто мерджим. В случае если завести поле в классе, то в примере выше это условие сработает, и будет как будто он сам удалил 2 шт. Причем здесь версионность вообще? Как ты собираешься версионность к OneToMany применять? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.08.2016, 17:14 |
|
||
|
JPA CASCADE
|
|||
|---|---|---|---|
|
#18+
no568924.1. Вытаскиваем из базы свежий список и видим что там 3. 4.2. разница != 2 => следовательно ничего не делаем, просто мерджим. какой смысл в этом числе? Представь, что в БД 100 юзверей постоянно меняют и правят дочек "Прописано" у ноды "Квартира". Т.е. каждую секунду цифра меняется от 0 до 30ти. Т.е. при сохранении эту цифру {0...30} ты с чем сравнил: Код: java 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.08.2016, 17:54 |
|
||
|
JPA CASCADE
|
|||
|---|---|---|---|
|
#18+
no56892Причем здесь версионность вообще? Как ты собираешься версионность к OneToMany применять? я сказал, что Паша01 привёл метод как в версионности. На что ты выше написал - Уродство. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.08.2016, 17:55 |
|
||
|
JPA CASCADE
|
|||
|---|---|---|---|
|
#18+
no56892, если у тебя МАКС количество дочек = 2 в Модели(БД), то это ДРУГОЕ условие и ТЗ. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.08.2016, 17:57 |
|
||
|
JPA CASCADE
|
|||
|---|---|---|---|
|
#18+
no56892, короче, мне метод Паша01 понравился больше). Выбирай сам. Удачи! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.08.2016, 18:02 |
|
||
|
JPA CASCADE
|
|||
|---|---|---|---|
|
#18+
А еще, если гарантированно нужно отправить письмо, то по срабатыванию условия должна создаваться запись в какой-то таблице, из которой отдельный процесс будет периодически выгребать записи и рассылать по ним письма. Иначе возможны ситуации либо когда записи удалятся, а письмо отправится либо наоборот - записи не удалятся, а письмо отправится. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.08.2016, 18:28 |
|
||
|
JPA CASCADE
|
|||
|---|---|---|---|
|
#18+
Локшин МаркА еще, если гарантированно нужно отправить письмо, то по срабатыванию условия должна создаваться запись в какой-то таблице, из которой отдельный процесс будет периодически выгребать записи и рассылать по ним письма. Иначе возможны ситуации либо когда записи удалятся, а письмо отправится либо наоборот - записи не удалятся, а письмо отправится. Да, письмо как пример, на самом деле надо вставлять запись в БД. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.08.2016, 18:31 |
|
||
|
|

start [/forum/topic.php?all=1&fid=59&tid=2123768]: |
0ms |
get settings: |
5ms |
get forum list: |
14ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
122ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
85ms |
get tp. blocked users: |
1ms |
| others: | 199ms |
| total: | 444ms |

| 0 / 0 |
