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


Как добавить логику, если например удаляется 2 OtherEntity если используется Cascade? Т.е. в сервис приходит Entity с уже двумя удаленными OtherEntity, как в таком случае это обработать?
...
Рейтинг: 0 / 0
30.08.2016, 14:02
    #39300265
Паша01
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JPA CASCADE
Если ты в объекте Entity удалил 2 OtherEntity, потом делаешь flush или commit своим EntityManager, то все, тех самых 2 OtherEntity не будет ни в памяти приложения ни в БД. После этого передаешь объект Entity в какой-нибудь сервис и не увидишь больше своих удаленных элементов в коллекции. Или я не понял твоей проблемы?
...
Рейтинг: 0 / 0
30.08.2016, 14:05
    #39300267
no56892
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JPA CASCADE
Паша01,
Допустим мне при удалении 2х ентити надо отправить емэйл
...
Рейтинг: 0 / 0
30.08.2016, 14:05
    #39300268
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JPA CASCADE
no56892в сервис приходит Entity с уже двумя удаленными OtherEntity
кем и где удалёнными?
Тип каскада - все. Значит ВСЕ операции, в том числе с БД отслеживает маппинг и потом реализует.
Если объекты вне сессии напр. хибера, то их надо аттачить к сессии.
...
Рейтинг: 0 / 0
30.08.2016, 14:09
    #39300272
no56892
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JPA CASCADE
Может так понятнее будет:
Код: java
1.
2.
3.
4.
5.
получить из сервиса Entity c others
->
сделать other.remove() два раза
->service.merge(entity);
//вот тут мне надо выполнить БЛ если удалилось 2 OtherEntity...
...
Рейтинг: 0 / 0
30.08.2016, 14:11
    #39300274
Паша01
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JPA CASCADE
Так напиши свой метод removeAndSendEmails() внутри класса Entity и вызывай для удаления только его
...
Рейтинг: 0 / 0
30.08.2016, 14:13
    #39300277
Паша01
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JPA CASCADE
Неправильно выразился. Напиши этот метод removeAndSendEmails() внутри какого-то сервиса. В нем сначала удали, а потом отправь емейл. Просто замени вызовы other.remove() на entityService.removeAndSendEmails()
...
Рейтинг: 0 / 0
30.08.2016, 14:14
    #39300278
Паша01
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JPA CASCADE
Или можешь использовать ListChangeListener. Повесь его на свою коллекцию. Внутри слушателя увидишь, если произошло удаление, то отправляй емейл
...
Рейтинг: 0 / 0
30.08.2016, 14:14
    #39300279
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JPA CASCADE
no56892Допустим мне при удалении 2х ентити надо отправить емэйл
@PostPersist
?
...
Рейтинг: 0 / 0
30.08.2016, 14:15
    #39300283
no56892
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JPA CASCADE
Там большой граф с Ентити, и помимо удаления 2х объектов Юзер еще много чего модифицирует. Как ты предлагаешь это не подходит, т.к. не будет сделано в одной транзакции раз и ты предлагаешь удалить CASCADE два.
...
Рейтинг: 0 / 0
30.08.2016, 14:16
    #39300285
Паша01
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JPA CASCADE
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
30.08.2016, 14:17
    #39300286
no56892
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JPA CASCADE
Petro123no56892Допустим мне при удалении 2х ентити надо отправить емэйл
@PostPersist
?
Здорово, но как я узнаю что удалилось 2 Ентити?
...
Рейтинг: 0 / 0
30.08.2016, 14:20
    #39300291
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JPA CASCADE
no56892Здорово, но как я узнаю что удалилось 2 Ентити?
нет логики.
Что значит 2? Это сакральное число?
Тогда это бизнес-логика и делать нужно по другому.
...
Рейтинг: 0 / 0
30.08.2016, 14:21
    #39300292
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JPA CASCADE
Petro123,
вообще, нельзя на триггеры в кавычках нагружать отправку по мылу.
...
Рейтинг: 0 / 0
30.08.2016, 14:22
    #39300293
Паша01
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JPA CASCADE
С такой логикой подходит лучше всего ListChangeListener. В нем ты можешь увидеть, что удалилось именно 2 элемента.
...
Рейтинг: 0 / 0
30.08.2016, 14:22
    #39300294
no56892
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JPA CASCADE
Petro123,
Как, кроме как руками все разбирать и забить на Cascade?
...
Рейтинг: 0 / 0
30.08.2016, 14:26
    #39300298
no56892
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JPA CASCADE
Паша01С такой логикой подходит лучше всего ListChangeListener. В нем ты можешь увидеть, что удалилось именно 2 элемента.
Хибернейт свои коллекции использует.
...
Рейтинг: 0 / 0
30.08.2016, 14:29
    #39300301
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JPA CASCADE
no56892Petro123,
Как, кроме как руками все разбирать и забить на Cascade?
не могу ответить когда постановка странная).
Что за число 2 и кто создал проблему с этим числом?
Если нужно отправлять мыло только при выписке из квартиры двоих, то проверять надо в сервисном слое где происходит выписка.
Модель данных, маппинг и каскад ни при чём.
...
Рейтинг: 0 / 0
30.08.2016, 14:31
    #39300303
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JPA CASCADE
Паша01что удалилось именно 2 элемента.
можно в триггере
Код: java
1.
2.
if select count(*) children <> 2 then
  EMAIL


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


Ещё есть контекст. Посмотри что там можно посчитать про "2".
...
Рейтинг: 0 / 0
30.08.2016, 14:40
    #39300317
Паша01
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JPA CASCADE
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
30.08.2016, 14:42
    #39300321
Паша01
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JPA CASCADE
Да и вообще гугл меня приводит к http://www.glazedlists.com/
...
Рейтинг: 0 / 0
30.08.2016, 15:03
    #39300335
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JPA CASCADE
Паша01и в любом месте в приложении повесить на его поле
а если юзверь просто играется с коллекцией? Т.е. коммит - сохранить не нажимал, а идёт по мастеру страничкам в одной сессии.
Тогда зазря уйдёт по мылу сообщение об удалении 2-х объектов.
...
Рейтинг: 0 / 0
30.08.2016, 15:14
    #39300343
Паша01
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JPA CASCADE
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
30.08.2016, 15:21
    #39300358
Паша01
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JPA CASCADE
Или ещё 2-ой вариант, более универсальный.
Если ты удалил 2 элемента коллекции others, и сохранишь это, то для объекта Entity ВРОДЕ КАК должна сработать конструкция @PostUpdate. И в нем с помощью все той же переменной oldOthersSize из примера выше узнаешь, что удалилось 2 элемента. Вот только я точно не знаю, сработает ли @PostUpdate в такой ситуации. Возьми проверь )))
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / JPA CASCADE / 25 сообщений из 43, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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