У меня есть простой домен, который выглядит следующим образом
@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
раньше, а затем найти объект и затем каким-то образом объединить его с существующим ... Но есть ли другой способ?