这是我的节点:
@NodeEntity
public class User {
@Id
@Index(unique = true)
@GeneratedValue(strategy = UuidStrategy.class)
private String id;
@Relationship(type = "LIKE")
private Collection<Pattern> likedPatterns;
...
}
@NodeEntity
public class Pattern {
@Id
@Index(unique = true)
@GeneratedValue(strategy = UuidStrategy.class)
private String id;
private String name;
@Relationship(type = "LIKE", direction = Relationship.INCOMING)
private List<User> likes;
...
}
我尝试删除用户和模式之间的关系:
@Override
@Transactional(readOnly = false)
public void deleteLikedPattern(String patternId, Long authId) {
User user = userRepository.findByAuthId(authId);
user.getLikedPatterns().removeIf(p -> p.getId().equals(patternId));
userRepository.save(user);
}
在初学者中有2种模式。在调试时,我可以看到在模式集合中找到了patternId,并且从列表中删除了相应的模式。 然后save()完成,并且我没有错误。但是,如果我签入数据库,则模式和用户仍保持链接,关系仍在这里。
我在这篇Neo4j OGM how to delete relationship上尝试了有效的解决方案。这意味着,如果要删除关系,则必须删除两个实体列表中的关联:
从特征码用户的集合中删除用户)
这有点乏味...
在许多其他询问相同问题的线程中,人们似乎不建议删除双方的关联。 我的问题是:我是否必须删除双方的关联,还是应该仅从用户的收藏夹列表中删除模式即可。
Thx
答案 0 :(得分:0)
首先,不需要在不需要的两个类中都完整解释您的关系映射。 (个人说明:从体系结构的角度来看,我会尽量避免类之间的双向依赖。)
答案是,您只需要在“领先”端将其删除。这是您的User
。在您坚持user
的那一刻,该关系将被删除,因为Neo4j-OGM a)看到了修改,并且b)无法到达截止节点以遍历到user
并在其中重新创建它同样的过程。
一些附加说明:如果以上示例将Pattern
视为汇总根,则甚至不应该存在User
的存储库。因此,持久保存Pattern
总是需要持久保存相关的User
。如我所见,这在您当前的域模型中稍微复杂一点,因为您正在使用m:n(多对多)映射。 Spring Data的想法是使您能够在DDD(域驱动程序设计)中进行思考和工作。我建议阅读这篇文章http://udidahan.com/2009/01/24/ddd-many-to-many-object-relational-mapping/和/或其他许多使用DDD的文章。