문제

이 문제를 알아 내려고 노력하고 많은 사람들이 비슷한 문제를 겪고있는 시간이 꽤 있습니다.

나는 최대 절전 모드를 사용하여 소셜 네트워크에서 사용자를 모델링하려고 노력하고 있으며, 우정 관계를 매핑하는 것보다 소셜 네트워크의 기본은 무엇입니까? 시스템의 모든 사용자에게는 친구 목록이 있어야하며 이것이 엄청나게 쉬운 작업 일 수 있다고 생각했습니다 (많은 사람의 관계를 사용하십시오.) 그래서 나는 다음을 시도했습니다.

@Entity
@Table(name="users")
public class User {
   @Id
   @GeneratedValue(strategy=GenerationType.AUTO)
   @Column(name="userid")
   protected Long id = null;
   @ManyToMany
   protected List<User> friends = null
}

문제는 이제 친구와 친구가되면서 많은 사람들을 잘못 사용한다고 말한다는 것입니다. 지금까지 너무 좋아, 나는 오류를 얻지 만 어떻게 내가 원하는 것을 할 수 있습니까?

아이디어가 있습니까? 나는 내 지혜의 끝에 도달했다.

도움이 되었습니까?

해결책

많은 사람들에 대한 사실은 최대 절전 모드가 관계 테이블을 생성하는 것이 필수적이기 때문에 약간 더 구성이 필요하다는 것입니다. 이 시도:


@Entity
@Table(name="users")
public class User {
   @Id
   @GeneratedValue(strategy=GenerationType.AUTO)
   @Column(name="userid")
   protected Long id = null;
   @ManyToMany
   @JoinTable(name = "user_friends", 
       joinColumns = @JoinColumn(name = "user_id"), 
       inverseJoinColumns = @JoinColumn(name = "friend_id"))
   protected List friends = null;
   @ManyToMany(mappedBy = "friends")
   protected List befriended = null;
}

그것이 작동하기를 바랍니다 =)

편집 : 또한 Fetch 유형에 매우주의하십시오 ... 통제 외 루프를 가져오고 모든 DB를 얻을 수 있습니다.

다른 팁

그만큼 ManyToMany 주석에는 매핑 된 매개 변수가 있습니다. 나는 같은 것을 생각한다

@ManyToMany(mappedBy = "friends")

작동 할 수도 있습니다. 어쨌든 참조하십시오 문서.

편집하다:

마치 많은 관계가 양쪽 끝에서 액세스 할 수 있어야하는 것처럼 보입니다. 현재 귀하는 한쪽 끝에서만 액세스 할 수 있습니다. 어쩌면 다른 관계를 추가해야 할 수도 있습니다.

@Entity
@Table(name="users")
public class User {
   @Id
   @GeneratedValue(strategy=GenerationType.AUTO)
   @Column(name="userid")
   protected Long id = null;
   @ManyToMany
   protected List<User> friends = null;
   @ManyToMany(mappedBy = "friends")
   protected List<User> befriended = null;
}

그래도 작동하지 않으면 항상 두 사용자 간의 관계를 나타내는 별도의 클래스를 소개하고 모든 사용자 에게이 클래스의 인스턴스를 모으도록 할 수 있습니다.

좋은 지적, 사실 나는 그것을 시도했다. 문제는 관계의 양쪽에 설정되는 Mappedby 속성에 대한 불만을 얻는다는 것입니다. 이는 사실이지만 유효하지 않습니다. 나는 단순한 것을 궁금해했다 @ManyToMany 친구를 가져 오기 위해 영리한 사용자 정의 쿼리를 사용하면 솔루션이 될 수 있습니다. ManyToMany 가입 테이블을 생성합니다 user_id 그리고 friend_id, 그러나 쿼리는 필드 중 하나와 일치하여 일치하는 모든 사용자를 반환합니다. friend_id 아니면 그 user_id 그건. 어떤 아이디어?

물론 그것은 좋은 수정이 될 것이지만, 나는 아직 완전히 팔리지 않았습니다. 기본적으로 친구를 얻으려면 두 컬렉션을 합쳐야합니다.

최대 절전 모드에서 묘사적이고 반사적 인 관계를 만들 수있는 방법이 전혀 없습니까?

나는 오늘도 같은 문제가있었습니다.

@Entity
@Table(name="users")
public class User {
   @Id
   @GeneratedValue(strategy=GenerationType.AUTO)
   @Column(name="userid")
   protected Long id = null;
   @ManyToMany
   protected List<User> friends = null
}

괜찮아야합니다. 비슷한 구조를 사용했습니다. 그러나 나는 게으른 로딩 예외를 얻었고 FetchType을 열망하게 설정할 때 가방의 재귀 초기화에 대한 불만을 얻었습니다.

내 문제를 해결하는 방법 : '사용자'를 가져 오는 데 사용하는 쿼리에서 다음과 같은 작업을 수행하십시오.

from User as u left join fetch u.friends

이것은 해당 엔티티의 친구 목록을 초기화합니다. 그 친구들로부터 친구를 초기화하지는 않지만 경고를받습니다. 그것은 실제로 좋은 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top