私はSpring-Data-Neo4J(4.0.0.RELEASE)を使ってアプリケーションを構築しています。アプリケーションには、PersonエンティティとGroupエンティティの2つのエンティティがあります。また、関係エンティティMember_Ofもあります。これは、ある人がグループのメンバーであることを示します。エンティティは以下のようになりますNeo4Jの2ノード間の多重関係を防止
メンバーをグループに追加する方法があります。このメソッドに@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が返された場合、つまり関係が存在しない場合、グループに追加されます。
問題は、同じ人物が同じグループに複数回追加されることがあることがあります。これは、2人のユーザーがアプリケーションを実行しているときに、同じユーザーを同じグループに追加しようとするときに発生します。
これを防ぐにはどうすればよいですか?私は人とグループとの間に単一の関係を持つ必要があり、複数のものではありません。
タイムスタンプは、メンバーのグループへの参加時間を記録するために必要です。重複した関係を避けるために小切手を保管しています。私は、既存の関係があるかどうかを確認しています。そうでない場合は、メンバーを追加するだけです。私は全体の方法を同期さえしました。しかし、依然として同時リクエストを送信すると、重複した関係になります。どうすれば問題を解決できますか? – Soumya
javaエンティティのhashtagとequalsメソッドの実装は、Neo4Jに格納されているか、またはNeo4Jから取得された方法に(もしあれば)影響を与えますか? equalsメソッドが適切に実装されていないか、部分的にしか実装されていない場合、Neo4jで豊富な関係を更新する際に問題があることがわかりました。実際、後者の場合、関係は失われつつあります。 – Soumya