SDN сохраняет узлы и обновляет свойства подключенных отношений

Мы используем выпуск spring-data-neo4j 2.2.2.Release и Neo4j 1.9.

Сохранение и обновление узлов (свойств) отлично работает с использованием GraphRepository.

Наш самый простой пример выглядит так:

public interface LastReadMediaRepository extends GraphRepository<Neo4jLastReadMedia> {}

Мы также устанавливаем некоторые отношения, связанные с узлом, класс узла выглядит так

@NodeEntity
public class Neo4jLastReadMedia {

@GraphId
Long id;

@JsonIgnore
@Fetch @RelatedToVia(type = "read", direction = Direction.OUTGOING) 
Set<LastReadMediaToLicense> licenseReferences;  

public Neo4jLastReadMedia() {
}

public Long getId() {
    return id;
}

public void setId(Long id) {
    this.id = id;
}

public void read(final Neo4jLicense license, final Long lastAccess, final float progress, final Long chapterId) {
    licenseReferences.add(new LastReadMediaToLicense(this, license, lastAccess, progress, chapterId));
}

public Set<LastReadMediaToLicense> getLicenseReferences() {
    return licenseReferences;
}

@Override
public String toString() {
    return "Neo4jLastReadMedia [id=" + id + "]";
}   
}

Теперь мы сохраняем узел, используя метод save() репозитория. Отношения также сохраняются, по крайней мере, при первом сохранении.

Позже, когда мы хотим изменить свойства отношения (обновить отношение), которое уже существует (например, lastAccess), мы извлекаем узел из базы данных, манипулируем его набором отношений, здесь Set<LastReadMediaToLicense> licenseReferences;, а затем пытаемся сохранить узел обратно с save()

К сожалению, отношения не обновляются, и все свойства остаются прежними...

Мы знаем, как это сделать с помощью аннотированных шифровальных запросов в репозитории, но должен же быть «абстрактный» способ?!

Большое спасибо!

С уважением

РЕДАКТИРОВАНИЕ: если я удаляю связь из набора, а затем выполняю save() на узле, связь удаляется. Только обновление не работает! Или это намерение?


person AndyB    schedule 14.08.2013    source источник
comment
Не могли бы вы привести пример кода, показывающий неудачное обновление?   -  person remigio    schedule 15.08.2013


Ответы (1)


Энди,

SDN проверяет только модификации набора, то есть добавления и удаления, а не проверяет каждую связь на наличие изменений, что было бы еще дороже.

Обычно это можно решить, сохранив отношение через репозиторий или шаблон, а не добавляя его в набор, а затем сохраняя узел. Это также быстрее.

person Michael Hunger    schedule 15.08.2013
comment
Привет, Майкл, спасибо за разъяснение поведения. Так что наши выводы были верны: сохранение и удаление работают нормально. Мы пытались использовать репозиторий отношений, на самом деле у нас просто не получилось. Не могли бы вы предоставить демо-код здесь? Я действительно пытался изучить документацию, но не нашел там решения. Любая помощь приветствуется, спасибо! PS: у нас уже есть рабочее решение с использованием аннотированных запросов, но всегда полезно знать больше альтернатив :-) - person AndyB; 15.08.2013