【发布时间】:2016-06-25 04:31:29
【问题描述】:
我正在使用 Spring-Data-Neo4J (4.0.0.RELEASE) 构建应用程序。该应用程序有两个实体,一个 Person 实体和一个 Group 实体。还有一个关系实体,Member_Of,它表示一个人是一个组的成员。实体如下所示
@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,即不存在关系,则将其添加到组中。
问题有时是同一个人被多次添加到同一组中。当两个人正在运行应用程序并且他们都试图将同一个人添加到同一个组时,就会发生这种情况。
如何防止这种情况发生?我需要在一个人和组之间建立一个单一的关系,而不是多个关系。
【问题讨论】:
标签: neo4j spring-data-neo4j-4 neo4j-ogm