2011-12-28 5 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. 그렇다면 새로 고침해야하는 친구 목록을 어떻게 알 수 있습니까?

편집 : 또한 (캐스케이드 = CascadeType.ALL)을 제거해야합니다. 왜냐하면 u1을 제거하면 모든 쌍을 이루는 멤버가 제거되기 때문입니다. 이것이 올바른 행동입니까?

답변

3

흠, 왜 2리스트 friendsfriendsOf이 필요합니까? 네가 내 친구라면 네 친구라고 분명하지 않니?

게다가 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"/> 

는 그런 모든 것이 잘 작동합니다.

관련 문제