我有两个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;
}
当我向用户添加设备然后执行保存时,我会得到以下图表:
稍后,当我从用户设备集中删除设备并保存它,并将设备用户设置为null并保存时,我仍然拥有相同的图形,这意味着设备和用户之间的关系仍然存在。
我做错了什么?有没有办法删除它?
答案 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中可能存在错误。如果是哪种情况,请在此处报告!