2011-12-28 4 views
2

Я создал отношение @ManyToMany с тем же объектом.Правильный способ удалить объект из списка @ManyToMany

Вот моя сущность:

@Entity 
@Table(name = "user") 
public class User extends BaseEntity implements Serializable { 

... 

@ManyToMany(cascade = CascadeType.ALL) 
@JoinTable(name = "table_friends", joinColumns = 
@JoinColumn(name = "userId"), inverseJoinColumns = 
@JoinColumn(name = "friendId")) 
private List<User> friends; 

@ManyToMany(cascade = CascadeType.ALL) 
@JoinTable(name = "table_friends", joinColumns = 
@JoinColumn(name = "friendId"), inverseJoinColumns = 
@JoinColumn(name = "userId")) 
private List<User> friendsof; 

Я создал несколько «пользователей» и добавили их в список друзей:

User u1 = new User(); 
User u2 = new User(); 
User u3 = new User(); 

u1.getFriends().add(u2); 
u1.getFriendsof().add(u2); 
u1.getFriends().add(u3); 
u1.getFriendsof().add(u3); 

Когда я удалить друга из списка u1.getFriends().remove(u3), все в порядке , Но когда я хочу удалить пользователя из базы данных u3.remove(), друзья u1 все те же, хотя уже в списке друзей друга правильно.

  1. Можно ли как-то обновить список после удаления пользователя?
  2. И если да, то как я могу узнать, какой список друзей мне нужно обновить?

Редактировать: Также мне кажется, что я должен удалить (cascade = CascadeType.ALL), потому что когда я удаляю u1, удаляет все парные элементы. Это правильное поведение?

ответ

3

Хм, зачем вам 2 списка friends и friendsOf? Если ты мой друг, разве не очевидно, что я твой друг?

Кроме того, если вы хотите только закончить связь между 2 User, вы должны использовать u1.getFriends().remove(u3).

И наконец, если вы хотите удалить пользователя. Вы должны создать EntityManager em и выполнить команду em.remove(u3). Эта команда удалит u3, а также связь. Однако, вы должны быть осторожны с cascade = CascadeType.ALL. Этот cascadeType означает, что если вы удалите u3, u1 также будет удален. Я думаю, вы должны оставить его @ManyToMany без каскада.

+0

Все каскады, которые я уже удалил. Когда дело доходит до удаления, я использую EntityManager em.remove (u). Но он не работает, как я ожидал, потому что после em.remove (u3), когда я проверяю базу данных (от администратора MySQL), u3 не существует, однако он все еще существует в u1.friends. Исчезает после перезапуска программы. Любая идея, почему так поздно? – galica

+0

Хм, это странно. Я попытался удалить запись в своем приложении, и все отношения обновлены должным образом. ^^ Думаю, вы должны обновить свой вопрос с этим странным поведением. Я уверен, что кто-то еще сможет вам помочь. –

+0

Можете ли вы поделиться, как вы это делаете? – galica

0

Я нашел другое решение, но только при использовании EclipseLink.

В persistance.xml вам нужно добавить свойство:

<property name="eclipselink.cache.shared.default" value="false"/> 

Тогда все работает отлично.

Смежные вопросы