Удаление ManyToMany сущностей
От: Аноним  
Дата: 02.07.13 06:00
Оценка:
Использую Hibernate 4.1, Spring Data JPA 1.3.1. Сущности описаны так:

class User {
    @ManyToMany(cascade = CascadeType.ALL)
    @JoinTable(name = "event_user")
    private Set<Event> events;
}

class Event {
    @ManyToMany(cascade = CascadeType.ALL, mappedBy = "events")
    private Set<User> users;
}


Задача: при удалении User удалить все event где нет других User.

Чего только не пробовал, но никак не удаляются Event. Результат один, User удаляется из таблицы event_user связь тоже удаляется.

UserRepository userRepository; // extends JpaRepository<User, Long>
EventRepository eventRepository; // extends JpaRepository<Event, Long>
...

for (Event event : user.getEvents()) {
    event.getUsers().remove(user);
    if (event.getUsers().isEmpty()) {
        eventRepository.delete(event);
    } else {
        eventRepository.save(event);
    }
}
userRepository.delete(user);


Подскажите что я упускаю.
Re: Удаление ManyToMany сущностей
От: tavr  
Дата: 02.07.13 06:53
Оценка:
Здравствуйте, Аноним, Вы писали:

а так:
А>
А>class User {
А>    @ManyToMany(cascade = CascadeType.ALL, orphanRemoval = true)
А>    @JoinTable(name = "event_user")
А>    private Set<Event> events;
А>}
Re[2]: Удаление ManyToMany сущностей
От: Аноним  
Дата: 02.07.13 07:14
Оценка:
Здравствуйте, tavr, Вы писали:

T>Здравствуйте, Аноним, Вы писали:


T>а так:

А>>
А>>class User {
А>>    @ManyToMany(cascade = CascadeType.ALL, orphanRemoval = true)
А>>    @JoinTable(name = "event_user")
А>>    private Set<Event> events;
А>>}
T>


У ManyToMany нет атрибута orphanRemoval (JPA 2.0).
Re[3]: Удаление ManyToMany сущностей
От: tavr  
Дата: 03.07.13 07:28
Оценка:
Здравствуйте, Аноним, Вы писали:

А>У ManyToMany нет атрибута orphanRemoval (JPA 2.0).

да, проглядел

попробуй сначала обновить коллекции (разорвать связи), а потом уже удадить элементы
List<Event> events2Remove = new ArrayList<Event>();
for (Event event : user.getEvents()) {
    event.getUsers().remove(user);
    if (event.getUsers().isEmpty()) {
        events2Remove.add(event);
    }
    eventRepository.save(event);
}
if (!events2Remove.isEmpty()) {
    for (Event event : events2Remove) {
        eventRepository.delete(event);
    }
}
userRepository.delete(user);
Re[4]: Удаление ManyToMany сущностей
От: Аноним  
Дата: 03.07.13 10:19
Оценка:
Здравствуйте, tavr, Вы писали:

T>попробуй сначала обновить коллекции (разорвать связи), а потом уже удадить элементы


Пробовал, не помогает. Причем когда смотрю запросы которые приходят в БД (добавляя flush() после каждой операции), то там только:
LOG:  execute <unnamed>: delete from event_user where users_id=$1
LOG:  execute <unnamed>: delete from users where id=$1

т.е. оно даже не пытается удалить Event.
Re[3]: Удаление ManyToMany сущностей
От: wildwind Россия  
Дата: 03.07.13 11:29
Оценка:
Здравствуйте, Аноним, Вы писали:

А>У ManyToMany нет атрибута orphanRemoval (JPA 2.0).


Вот собственно и ответ.
Re[4]: Удаление ManyToMany сущностей
От: Аноним  
Дата: 04.07.13 02:21
Оценка:
Здравствуйте, wildwind, Вы писали:

А>>У ManyToMany нет атрибута orphanRemoval (JPA 2.0).


W>Вот собственно и ответ.


Я и не жду что оно само удалиться. Не понятно почему при ручном удалении сущностей данные не удаляются.
Re[5]: Удаление ManyToMany сущностей
От: hrensgory Россия  
Дата: 04.07.13 13:23
Оценка:
On 04.07.2013 06:21, Аноним 762 wrote:

> Я и не жду что оно само удалиться. Не понятно почему при ручном удалении

> сущностей данные не удаляются.


Либо до eventR.delete(event) не доходит дело, либо баг в реализации
(Spring,Hibernate). Залезьте туда отладчиком (сырцы же доступны) и
посмотрите в чём дело — почему не генерится DELETE statement.

Кроме того, интересно что там у вас с транзакциями.

--
WBR,
Serge.
Posted via RSDN NNTP Server 2.1 beta
Re: Удаление ManyToMany сущностей
От: Аноним  
Дата: 05.07.13 02:43
Оценка:
Всем спасибо за помощь.

Проблема оказалась в другой сущности которая была связана с Event и не было указано каскадное обновление.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.