обновить узел, если существует - PullRequest
0 голосов
/ 03 января 2019

У меня есть простой домен, который выглядит следующим образом

@Data
@EqualsAndHashCode(callSuper = true)
@NodeEntity
public class StoryCharacter extends GraphObject {
    @Index(unique = true)
    private String agnosticId;
    private String name;

    @Relationship(type = "FAMILIAR_WITH")
    private Set<StoryCharacter> acquaintances;

    @Labels
    private Set<String> labels = new HashSet<>();

    // Neo4j requires constructor
    public StoryCharacter() {}
}

И GraphObject выглядит следующим образом

@Data
abstract class GraphObject {
    @Id
    @GeneratedValue
    private Long id;
}

Процесс сохранения и загрузки объекта выглядит следующим образом

var session = req.require(SessionFactory.class).openSession();
try (var tx = session.beginTransaction()) {
    session.save(character);
    tx.commit();
}

try (var tx = session.beginTransaction(Type.READ_ONLY)) {
    Collection<StoryCharacter> lists = session.loadAll(StoryCharacter.class,
        AgnosticIdUtils.findByIdQuery(character.getAgnosticId()));
    tx.commit();

    return TPCollectionUtils.getFirstElement(lists);
}

Для генерации angnosticId я создал слушатель, который выглядит следующим образом

public class AddCharacterIdListener extends EventListenerAdapter {
    @Override
    public void onPreSave(Event event) {
        StoryCharacter storyCharacter = (StoryCharacter) event.getObject();
        if (StringUtils.isBlank(storyCharacter.getAgnosticId())) {
            var schema = TPCollectionUtils.getFirstElement(storyCharacter.getLabels());
            var id = AgnosticIdUtils.generateId(schema, storyCharacter.getName());
            storyCharacter.setAgnosticId(id);
        }
    }
}

Но когда я сохраняю объект, он все равно создает его несколько раз.В базе данных у меня есть несколько узлов, которые имеют одинаковые agnosticId.

Как заставить его обновить объект, а не создавать его снова?Я мог бы, вероятно, сгенерировать agnosticId раньше, а затем найти объект и затем каким-то образом объединить его с существующим ... Но есть ли другой способ?

1 Ответ

0 голосов
/ 04 января 2019

Похоже, что этот вопрос имеет отношение к поиску объекта с пользовательским идентификатором .

. GraphObject определяет поле id, которое отражает внутренний идентификатор Neo4j.Если пользовательский идентификатор не определен, Neo4j-OGM будет использовать это поле, чтобы определить, находится ли объект в базе данных (установлен положительный идентификатор) или нет.

Аннотация @Index(unique=true) является лишь подсказкой дляNeo4j-OGM для создания индекса, если для функции автоматического управления индексами установлено подходящее значение.

...