1

我正在使用带有螺栓驱动器 2.0.6 的弹簧数据 neo4j 版本 4.1.2。我面临自动打破实体之间关系的问题。

我有一个名为组织的域,组织属于许多实体,但我只提到很少。

组织架构

    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);

我找不到,我做错了什么。请帮帮我,我们现在不能承受这种错误。

谢谢

4

1 回答 1

0

加载实体的默认深度为 1。这意味着findOne(id)只会返回给定实体 + 其直接连接的实体。在您的情况下organization --> country --> CountryHolidayCalender,只会加载组织和相关国家/地区。

这可能是您看不到附加节点的原因。

save跟踪对象状态,以检测更改并优化更新。find对于在和之间没有变化的对象/属性,将不会有数据库更新save

所以,只要不触碰@Relationship带注释的属性,就可以安全保存,即使没有加载也不会被修改。

关于您之前的评论,SDN 中没有用于动态深度检索的延迟加载(存在,已弃用)。所以,是的,你必须自己管理深度。如果您的数据量不是太大,您可能希望一次加载所有内容(使用find(id, -1))。另一种选择可能是按需加载,手动查询缺失的图表片段。

您可能还对这张票感兴趣,以便更好地控制实体加载。

于 2017-02-01T16:10:57.947 回答