powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / JPA CASCADE
43 сообщений из 43, показаны все 2 страниц
JPA CASCADE
    #39300257
no56892
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: java
1.
2.
3.
4.
5.
class Entity {
   
   @OneToMany(Cascade = ALL)
   Set<OtherEntity> others;
}


Как добавить логику, если например удаляется 2 OtherEntity если используется Cascade? Т.е. в сервис приходит Entity с уже двумя удаленными OtherEntity, как в таком случае это обработать?
...
Рейтинг: 0 / 0
JPA CASCADE
    #39300265
Фотография Паша01
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если ты в объекте Entity удалил 2 OtherEntity, потом делаешь flush или commit своим EntityManager, то все, тех самых 2 OtherEntity не будет ни в памяти приложения ни в БД. После этого передаешь объект Entity в какой-нибудь сервис и не увидишь больше своих удаленных элементов в коллекции. Или я не понял твоей проблемы?
...
Рейтинг: 0 / 0
JPA CASCADE
    #39300267
no56892
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Паша01,
Допустим мне при удалении 2х ентити надо отправить емэйл
...
Рейтинг: 0 / 0
JPA CASCADE
    #39300268
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
no56892в сервис приходит Entity с уже двумя удаленными OtherEntity
кем и где удалёнными?
Тип каскада - все. Значит ВСЕ операции, в том числе с БД отслеживает маппинг и потом реализует.
Если объекты вне сессии напр. хибера, то их надо аттачить к сессии.
...
Рейтинг: 0 / 0
JPA CASCADE
    #39300272
no56892
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Может так понятнее будет:
Код: java
1.
2.
3.
4.
5.
получить из сервиса Entity c others
->
сделать other.remove() два раза
->service.merge(entity);
//вот тут мне надо выполнить БЛ если удалилось 2 OtherEntity...
...
Рейтинг: 0 / 0
JPA CASCADE
    #39300274
Фотография Паша01
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так напиши свой метод removeAndSendEmails() внутри класса Entity и вызывай для удаления только его
...
Рейтинг: 0 / 0
JPA CASCADE
    #39300277
Фотография Паша01
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Неправильно выразился. Напиши этот метод removeAndSendEmails() внутри какого-то сервиса. В нем сначала удали, а потом отправь емейл. Просто замени вызовы other.remove() на entityService.removeAndSendEmails()
...
Рейтинг: 0 / 0
JPA CASCADE
    #39300278
Фотография Паша01
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Или можешь использовать ListChangeListener. Повесь его на свою коллекцию. Внутри слушателя увидишь, если произошло удаление, то отправляй емейл
...
Рейтинг: 0 / 0
JPA CASCADE
    #39300279
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
no56892Допустим мне при удалении 2х ентити надо отправить емэйл
@PostPersist
?
...
Рейтинг: 0 / 0
JPA CASCADE
    #39300283
no56892
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Там большой граф с Ентити, и помимо удаления 2х объектов Юзер еще много чего модифицирует. Как ты предлагаешь это не подходит, т.к. не будет сделано в одной транзакции раз и ты предлагаешь удалить CASCADE два.
...
Рейтинг: 0 / 0
JPA CASCADE
    #39300285
Фотография Паша01
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123no56892Допустим мне при удалении 2х ентити надо отправить емэйл
@PostPersist
?

Тогда уж @PostRemove - Executed after the entity manager remove operation is actually executed or cascaded. This call is synchronous with the remove operation.
...
Рейтинг: 0 / 0
JPA CASCADE
    #39300286
no56892
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123no56892Допустим мне при удалении 2х ентити надо отправить емэйл
@PostPersist
?
Здорово, но как я узнаю что удалилось 2 Ентити?
...
Рейтинг: 0 / 0
JPA CASCADE
    #39300291
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
no56892Здорово, но как я узнаю что удалилось 2 Ентити?
нет логики.
Что значит 2? Это сакральное число?
Тогда это бизнес-логика и делать нужно по другому.
...
Рейтинг: 0 / 0
JPA CASCADE
    #39300292
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123,
вообще, нельзя на триггеры в кавычках нагружать отправку по мылу.
...
Рейтинг: 0 / 0
JPA CASCADE
    #39300293
Фотография Паша01
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
С такой логикой подходит лучше всего ListChangeListener. В нем ты можешь увидеть, что удалилось именно 2 элемента.
...
Рейтинг: 0 / 0
JPA CASCADE
    #39300294
no56892
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123,
Как, кроме как руками все разбирать и забить на Cascade?
...
Рейтинг: 0 / 0
JPA CASCADE
    #39300298
no56892
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Паша01С такой логикой подходит лучше всего ListChangeListener. В нем ты можешь увидеть, что удалилось именно 2 элемента.
Хибернейт свои коллекции использует.
...
Рейтинг: 0 / 0
JPA CASCADE
    #39300301
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
no56892Petro123,
Как, кроме как руками все разбирать и забить на Cascade?
не могу ответить когда постановка странная).
Что за число 2 и кто создал проблему с этим числом?
Если нужно отправлять мыло только при выписке из квартиры двоих, то проверять надо в сервисном слое где происходит выписка.
Модель данных, маппинг и каскад ни при чём.
...
Рейтинг: 0 / 0
JPA CASCADE
    #39300303
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Паша01что удалилось именно 2 элемента.
можно в триггере
Код: java
1.
2.
if select count(*) children <> 2 then
  EMAIL


))))
...
Рейтинг: 0 / 0
JPA CASCADE
    #39300312
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
no56892,
там много чего есть:
Код: java
1.
@PrePersist, @PreUpdate, @PreRemove, @PostPersist, @PostUpdate, @PostRemove


Ещё есть контекст. Посмотри что там можно посчитать про "2".
...
Рейтинг: 0 / 0
JPA CASCADE
    #39300317
Фотография Паша01
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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...
});
}
...
Рейтинг: 0 / 0
JPA CASCADE
    #39300321
Фотография Паша01
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да и вообще гугл меня приводит к http://www.glazedlists.com/
...
Рейтинг: 0 / 0
JPA CASCADE
    #39300335
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Паша01и в любом месте в приложении повесить на его поле
а если юзверь просто играется с коллекцией? Т.е. коммит - сохранить не нажимал, а идёт по мастеру страничкам в одной сессии.
Тогда зазря уйдёт по мылу сообщение об удалении 2-х объектов.
...
Рейтинг: 0 / 0
JPA CASCADE
    #39300343
Фотография Паша01
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123Паша01и в любом месте в приложении повесить на его поле
а если юзверь просто играется с коллекцией? Т.е. коммит - сохранить не нажимал, а идёт по мастеру страничкам в одной сессии.
Тогда зазря уйдёт по мылу сообщение об удалении 2-х объектов.

Слушай, ты может сразу все расскажешь? Судя по твоему комментарию, ты банально можешь добавить поле oldOthersSize в Entity.
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
class Entity {
   
   @OneToMany(Cascade = ALL)
   Set<OtherEntity> others;

   @Transient
   int oldOthersSize;
}


Инициализируей его перед тем, как добавить объект Entity в свой граф. Когда юзер нажимает кнопку Сохранить, тупо сравниваешь размер текущей коллекции с переменной oldOthersSize. И все. Вот так легко узнаешь, что удалилось именно 2 элемента. Решение может и не верх элегантности, но реализуется максимум за 5 минут.
...
Рейтинг: 0 / 0
JPA CASCADE
    #39300358
Фотография Паша01
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Или ещё 2-ой вариант, более универсальный.
Если ты удалил 2 элемента коллекции others, и сохранишь это, то для объекта Entity ВРОДЕ КАК должна сработать конструкция @PostUpdate. И в нем с помощью все той же переменной oldOthersSize из примера выше узнаешь, что удалилось 2 элемента. Вот только я точно не знаю, сработает ли @PostUpdate в такой ситуации. Возьми проверь )))
...
Рейтинг: 0 / 0
JPA CASCADE
    #39300361
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Паша01Слушай, ты может сразу все расскажешь?
не. Я сам размышляю что лучше, что хуже.
Нет однозначности). Да и постановка странная.
Паша01Решение может и не верх элегантности, но реализуется максимум за 5 минут.
да.
+1
...
Рейтинг: 0 / 0
JPA CASCADE
    #39300363
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Паша01И в нем с помощью все той же переменной oldOthersSize
+1
)
...
Рейтинг: 0 / 0
JPA CASCADE
    #39300378
Фотография Паша01
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123,

Хаха, мне показалось, что это он написал, ник не посмотрел )))
...
Рейтинг: 0 / 0
JPA CASCADE
    #39300410
no56892
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Паша01Petro123пропущено...

а если юзверь просто играется с коллекцией? Т.е. коммит - сохранить не нажимал, а идёт по мастеру страничкам в одной сессии.
Тогда зазря уйдёт по мылу сообщение об удалении 2-х объектов.

Слушай, ты может сразу все расскажешь? Судя по твоему комментарию, ты банально можешь добавить поле oldOthersSize в Entity.
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
class Entity {
   
   @OneToMany(Cascade = ALL)
   Set<OtherEntity> others;

   @Transient
   int oldOthersSize;
}


Инициализируей его перед тем, как добавить объект Entity в свой граф. Когда юзер нажимает кнопку Сохранить, тупо сравниваешь размер текущей коллекции с переменной oldOthersSize. И все. Вот так легко узнаешь, что удалилось именно 2 элемента. Решение может и не верх элегантности, но реализуется максимум за 5 минут.
Это уродство)))
...
Рейтинг: 0 / 0
JPA CASCADE
    #39300419
Фотография Паша01
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
no56892Это уродство)))
Когда костыль является единственным решением, он становится эталонным)))
...
Рейтинг: 0 / 0
JPA CASCADE
    #39300425
no56892
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Оно не единственное, похоже придется при мердже сначала вытаскивать из базы еще раз и сравнивать ручками расхождения в списках.
...
Рейтинг: 0 / 0
JPA CASCADE
    #39300426
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
no56892Это уродство)))
какая постановка, такое и решение).
...
Рейтинг: 0 / 0
JPA CASCADE
    #39300428
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
no56892вытаскивать из базы еще раз
сессии разные.
Что с чем сравнивать?
...
Рейтинг: 0 / 0
JPA CASCADE
    #39300431
no56892
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123,
Какая разница то.
...
Рейтинг: 0 / 0
JPA CASCADE
    #39300455
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
no56892Petro123,
Какая разница то.
мы пока гадаем что означает цифра 2.
1. Например, в соседней сессии параллельно юзверь из 4-х чилдрен сделал 3.
А ты тут перечитываешь из базы где тоже одну удалил.

2. У хибера механизм версии сущности тоже точно такой же. Есть поле версия и мы потом сохраняя сверяемся с базой.
Код: java
1.
2.
3.
4.
@Version
@Column(name="OPTLOCK")
public Integer getVersion() { ... }
}
...
Рейтинг: 0 / 0
JPA CASCADE
    #39300456
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123и мы потом сохраняя сверяемся с базой.
вернее не мы, а хибер. Нам "нельзя" этот счётчик трогать.
Т.е. Паша01 вроде здраво предложил.
...
Рейтинг: 0 / 0
JPA CASCADE
    #39300469
no56892
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123,
1.Юзер вытащил с 4мя чайлдами. Сессия закрыта.
2.Юзер удалил (снял 2 чекбокса например) 2 чайлда в своем локальном графе.
3.Кто-то в это время из базы удалил 1 чайлда, т.е. по факту в базе сейчас уже 3, а не 4.
4.Юзер нажимает сейв.
4.1. Вытаскиваем из базы свежий список и видим что там 3.
4.2. разница != 2 => следовательно ничего не делаем, просто мерджим.

В случае если завести поле в классе, то в примере выше это условие сработает, и будет как будто он сам удалил 2 шт.

Причем здесь версионность вообще? Как ты собираешься версионность к OneToMany применять?
...
Рейтинг: 0 / 0
JPA CASCADE
    #39300499
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
no568924.1. Вытаскиваем из базы свежий список и видим что там 3.
4.2. разница != 2 => следовательно ничего не делаем, просто мерджим.
какой смысл в этом числе?
Представь, что в БД 100 юзверей постоянно меняют и правят дочек "Прописано" у ноды "Квартира".
Т.е. каждую секунду цифра меняется от 0 до 30ти.
Т.е. при сохранении эту цифру {0...30} ты с чем сравнил:
Код: java
1.
4.2. разница != 2 => следовательно ничего не делаем, просто мерджим.
...
Рейтинг: 0 / 0
JPA CASCADE
    #39300502
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
no56892Причем здесь версионность вообще? Как ты собираешься версионность к OneToMany применять?
я сказал, что Паша01 привёл метод как в версионности. На что ты выше написал - Уродство.
...
Рейтинг: 0 / 0
JPA CASCADE
    #39300504
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
no56892,
если у тебя МАКС количество дочек = 2 в Модели(БД), то это ДРУГОЕ условие и ТЗ.
...
Рейтинг: 0 / 0
JPA CASCADE
    #39300510
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
no56892,
короче, мне метод Паша01 понравился больше).
Выбирай сам. Удачи!
...
Рейтинг: 0 / 0
JPA CASCADE
    #39300534
Локшин Марк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А еще, если гарантированно нужно отправить письмо, то по срабатыванию условия должна создаваться запись в какой-то таблице, из которой отдельный процесс будет периодически выгребать записи и рассылать по ним письма. Иначе возможны ситуации либо когда записи удалятся, а письмо отправится либо наоборот - записи не удалятся, а письмо отправится.
...
Рейтинг: 0 / 0
JPA CASCADE
    #39300537
no56892
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Локшин МаркА еще, если гарантированно нужно отправить письмо, то по срабатыванию условия должна создаваться запись в какой-то таблице, из которой отдельный процесс будет периодически выгребать записи и рассылать по ним письма. Иначе возможны ситуации либо когда записи удалятся, а письмо отправится либо наоборот - записи не удалятся, а письмо отправится.
Да, письмо как пример, на самом деле надо вставлять запись в БД.
...
Рейтинг: 0 / 0
43 сообщений из 43, показаны все 2 страниц
Форумы / Java [игнор отключен] [закрыт для гостей] / JPA CASCADE
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]