나는 포스트 그레스 데이터베이스에 연결되어 있고 난 다음 문제를 건너 한 콘솔 응용 프로그램을 쓰고 있어요, 안녕하세요 음 :
public List<String> getCommonInterestsOfMyFriends(long personId) {
Person personOfIntrest = session.get(Person.class, personId);
//fetch friends from db via get Call
int size = personOfIntrest.getFriends().size();
int size2 = personOfIntrest.getFriendsWith().size();
int size3 = personOfIntrest.getIntrests().size();
Set<Tag> interests = personOfIntrest.getIntrests();
Set<Person> allFriends = personOfIntrest.getFriendships().keySet();
for (Person p : allFriends) {
Set<Tag> friendsInterests = p.getIntrests();
friendsInterests.retainAll(interests);
}
}
을 사람은 Join 테이블을 사용하여 ManyToMany 관계로 모델링 한 관심사를 가질 수 있습니다. 나는 여러 번 위에 코드를 호출하고 관심이없는 사람을 찾을 때까지 완전히 작동합니다. 그 후, 모든 Person에 대해 "관심사"세트는 비어 있습니다. 세트가 성공적으로로드 되었더라도.
내가 게터를 호출 지연 연결을 초기화하기 위해, 또한 시도 난 아직도 페치// fetch associated data via fetch join
Query q = session.createQuery("SELECT p FROM Person p "
+ "LEFT JOIN FETCH p.friends "
+ "LEFT JOIN FETCH p.friendsWith "
+ "LEFT JOIN FETCH p.intrests "
+ "WHERE p.id = :id");
q.setParameter("id", personId);
Person personOfIntrest = (Person) q.getSingleResult();
같은 문제 조인. 흥미가없는 사람을 쿼리하지 않는 한 관심 분야 세트가 성공적으로로드 된 후 세트가 비어 있습니다. 이것은 모두 같은 세션에 있습니다. 설정에 friendsInterests.retainAll(interests);
를 호출하여
나는 친구 이익을 조작 결국 : 도움말에 대한
덕분에, 종류의 미래에 궁금 누군가를 위해
그런 일이 무엇인지 이해하기 어렵다 모르고 당신이 어떤 사람에 대해 이야기하고이 코드에 invoved 많은 사람의 어떤 다른 사람들과 연결되어 있고 당신에게 "부르심을받습니다."하지만이 코드는 많은 사람들의 이익을 위해 retainAll()을 호출하므로 집합에서 관심을 제거하게됩니다. 특히 사람 중 한 명이 관심이없는 경우 –
예, 문제는 9 번 줄에서 getIntrests()의 첫 번째 호출입니다. 예를 들어 보겠습니다. ID가 9 인 Person에 대해,이 Person은 조인 테이블에 관련 컬럼을 가지고 있으며, intrests 세트가로드되고 모든 것이 정상입니다. 그런 다음 intrests가없는 ID 10 인 Person을 쿼리하므로 세트도 비어 있습니다. 이제 동일한 세션에서 사람 9를 다시 쿼리하면 intrests 세트가 비어 있습니다. 그 후에 모든 사람이 실제로 intrests를 가지고 있는지 여부는 동일합니다. 이것은 교차 부분 전에 모두입니다. 왜 이것이 혼란 스러울 지 알기 때문에 그 부분을 제거해야합니다. – IVIerlski
제거한 부분이 문제의 원인 일 가능성이 큽니다. 이 방법은 여러 사람에게 공통적 인 관심사를 돌려 주지만, 발견 된 사람의 모든 친구들의 관심사를 수정합니다. 왜 그 세트를 수정합니까? Hibernate의 버그라고 생각하지 마십시오. 그것은 당신의 코드에있는 버그입니다. –