Spring-Data-Neo4J (4.0.0.RELEASE)를 사용하여 응용 프로그램을 빌드하고 있습니다. 응용 프로그램에는 Person 엔티티와 Group 엔티티의 두 엔티티가 있습니다. 또한 관계 엔티티 인 Member_Of가 있습니다.이 엔티티는 사람이 그룹의 구성원임을 나타냅니다. 엔티티는 다음과 같습니다.Neo4J의 두 노드 간의 다중 관계 방지
@NodeEntity(label="Person")
public class Person {
protected String uuid;
protected String fullName;
protected String email;
@Relationship(type = RelationshipNames.MEMBER_OF, direction = Relationship.OUTGOING)
protected List<GroupMembership> groupMemberships = new ArrayList<GroupMembership>() ;
}
@NodeEntity(label="Group")
public class Group implements Serializable{
protected static final long serialVersionUID = 1L;
@GraphId
protected Long id;
protected String uuid;
protected String name;
@Relationship(type = RelationshipNames.MEMBER_OF, direction = Relationship.INCOMING)
protected List<GroupMembership> groupMemberships = new ArrayList<GroupMembership>() ;
}
@RelationshipEntity(type = RelationshipNames.MEMBER_OF)
public class GroupMembership implements Serializable{
private static final long serialVersionUID = 1L;
@GraphId Long id;
@Property String uuid;
@StartNode Person member;
@EndNode Group group;
@DateLong
Date date;
}
회원을 그룹에 추가하는 방법이 있습니다. 이 메소드에는 @Transactional 주석이 붙습니다. 샘플 코드는 아래와 같습니다.
@Override
@Transactional(propagation=Propagation.REQUIRED)
public ResponseEntity<GroupVO> addMembersToGroup(String groupUuid, String personUuid, List<String> personsToAdd){
Group group = groupRepository.findGroupByUuid(groupUuid);
List<Person> personsToAdd = IterableUtils.toList(personRepository.findPersonsByUuid(personUuids));
personsToAdd.forEach(personToAdd -> {
GroupMembership existingGroupMembership = getActiveMembership(group.getUuid(), personToAdd.getUuid());
if(existingGroupMembership==null){
GroupMembership newGroupMembership = new GroupMembership(personToAdd, group, GroupRoleNames.MEMBER, member.getUuid(), new Date());
personToAdd.getGroupMemberships().add(newGroupMembership);
group.getGroupMemberships().add(newGroupMembership);
}
groupRepository.save(group);
}
시도한 것은 personToAdd와 그룹 간의 기존 관계를 검색하는 것입니다. null가 돌려 주어 졌을 경우, 즉 관계가 존재하지 않는 경우는 그룹에 추가됩니다.
동일한 사람에게 동일한 사람이 여러 번 추가되는 경우가 종종 있습니다. 이는 두 사람이 응용 프로그램을 실행하고 둘 다 동일한 사용자를 동일한 그룹에 추가하려고 시도 할 때 발생합니다.
어떻게 이런 현상이 발생하지 않도록 할 수 있습니까? 나는 사람과 그룹 사이에 하나의 관계를 가져야하며, 여러 사람이 아닌 하나의 관계를 가질 필요가 있습니다.
구성원의 그룹 가입 시간을 기록하려면 시간 소인이 필요합니다. 나는 중복 관계를 피하기 위해 수표를 지켰습니다. 나는 기존 관계가 있는지를 확인하고 있습니다. 그렇지 않은 경우 멤버 만 추가하십시오. 나는 심지어 모든 방법을 동기화했다. 그러나 여전히 동시 요청을 보내면 중복 관계가 발생합니다. 문제를 어떻게 해결할 수 있습니까? – Soumya
자바 엔티티의 hashtag 및 equals 메소드 구현은 Neo4J에 저장되거나 검색되는 방식에 어떤 영향을 줍니까? equals 메서드가 제대로 구현되지 않았거나 부분적으로 만 구현 된 경우 Neo4j에서 풍부한 관계를 업데이트하는 동안 문제가 있다는 것을 발견했기 때문입니다. 사실, 관계는 후자의 경우 길을 잃고있다. – Soumya