我使用弹簧数据neo4j版本4.1.2与螺栓驱动程序2.0.6。我正面临着自动破坏实体之间关系的问题。
我有一个名为组织的域名,组织属于许多实体,但我提的很少。
组织架构
public class Organization {
private String formalName;
private String shortName;
@Relationship(type = COUNTRY)
private Country country;
@Relationship(type = HAS_GROUP)
private List<Group> groupList = new ArrayList<>();
}
国家/地区架构
public class Country {
@Relationship(type = HAS_HOLIDAY)
private List< CountryHolidayCalender> countryHolidayCalenderList;
}
当我更新组织时,它打破了所有国家的关系,如休息国家 - 假日关系等
组织更新代码
Organization unit = organizationGraphRepository.findOne(unitId);
unit.setFormalName(organizationGeneral.getFormalName());
unit.setShortName(organizationGeneral.getShortName());
organizationGraphRepository.save(unit);
我无法找到,我做错了什么。请帮助我,我们目前无法承受这种错误。
由于
答案 0 :(得分:0)
加载实体的默认深度为1.这意味着findOne(id)
仅返回给定实体+其直接连接实体。
在您的情况organization --> country --> CountryHolidayCalender
中,只会加载组织和相关国家/地区。
这可能就是为什么你没有看到附加的节点。
save
跟踪对象状态,检测更改并优化更新。
对于find
和save
之间没有变化的对象/属性,不会有数据库更新。
因此,只要您不触及@Relationship
带注释的属性,就可以安全地保存,即使未加载它们也不会被修改。
关于您之前的评论,SDN中没有用于动态深度检索的延迟加载(已存在,已弃用)。所以,是的,你必须自己管理深度。
如果您的数据量不是太大,您可能希望一次加载所有内容(使用find(id, -1)
)。
另一种选择可能是按需加载,手动查询丢失的图形。
您可能对this ticket感兴趣,以便更好地控制实体加载。