Neo4j: автоматически удаляет отношения
Я использую данные весны 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);
Я не могу найти, что я делаю не так. Пожалуйста, помогите мне, мы не можем позволить себе такую ошибку в настоящее время.
Спасибо
1 ответ
Глубина по умолчанию для загрузки объектов равна 1. Это означает, что findOne(id)
вернет только данный объект + его напрямую связанные объекты. В твоем случае organization --> country --> CountryHolidayCalender
Только организация и связанная страна будут загружены.
Возможно, поэтому вы не видите подключенные узлы.
save
отслеживает состояния объекта, обнаруживает изменения и оптимизирует обновления. Там не будет обновления базы данных для объектов / свойств, которые не изменились между find
а также save
,
Так что, пока вы не касаетесь @Relationship
аннотированные атрибуты вы можете безопасно сохранить, они не будут изменены, даже если они не были загружены.
Что касается вашего предыдущего комментария, в SDN нет отложенной загрузки для динамического извлечения глубины (существовало, устарело). Так что да, вы должны сами управлять глубиной. Если ваш объем данных не слишком велик, вы можете загрузить все сразу (с find(id, -1)
). Другим вариантом может быть загрузка по запросу, вручную запрашивая недостающие фрагменты графика.
Вы также можете быть заинтересованы в этом билете для более точного контроля загрузки объекта.