Neo4j OGM如何删除关系

时间:2016-02-14 11:29:45

标签: java neo4j spring-data-neo4j-4 neo4j-ogm

我有两个neo4j-OGM节点实体连接无属性关系,如下所示:

@NodeEntity
public class User {

    @Relationship(type = RelationshipNames.USER_DEVICES, direction = Relationship.UNDIRECTED)
    private Set<Device> devices;

}

@NodeEntity
public class Device {

    @Relationship(type = RelationshipNames.USER_DEVICES, direction = Relationship.UNDIRECTED)
    private User user;

}

当我向用户添加设备然后执行保存时,我会得到以下图表:

enter image description here

稍后,当我从用户设备集中删除设备并保存它,并将设备用户设置为null并保存时,我仍然拥有相同的图形,这意味着设备和用户之间的关系仍然存在。

我做错了什么?有没有办法删除它?

1 个答案:

答案 0 :(得分:1)

如果没有看到您编写的用于保存这些对象的代码,则不容易诊断您的问题。但是,我会建议两件事。

首先,我会确保域模型中用户设备引用的添加和删除由域模型本身管理。换句话说,每当添加或删除设备时,在User类上提供行为,以保持Device对象的一致性。

addDevice(Device device) {
    if (device.user() != null) {
        device.user().removeDevice(device)
    }
    device.setUser(this)
    devices.add(device);
}

显然你也需要写一个等价的removeDevice()。如果您通过用户管理对象,这将确保两个对象都正确同步。如果您还打算从设备管理它们,您应该在Device类上编写一个实现相同效果的等效updateUser()方法。

重点是:让你的域名模型完成这项工作。它更容易推理(和测试),你不需要在持久性代码中随处调用getter和setter只是为了让所有内容保持同步。

如果在完成这些更改之后仍然失败,那么将UNDIRECTED关系一方面改为INCOMING而另一方改为OUTGOING(无关紧要)。如果这解决了问题,则表明OGM中可能存在错误。如果是哪种情况,请在此处报告!