Новичок для SDN и Neo4j. Использование версии sdn: 4.1.6.RELEASE) и версия neo4j: 3.1.0.Spring Data Neo4J (SDN) Сохранение объекта с использованием Neo4jTemplate
Я пытаюсь простой программный способ сохранения объекта с использованием Neo4jTemplate без поддержки репозитория, и он, похоже, не работает.
Мой код (автономное приложение):
public class Scratchpad {
public static void main(String[] args) throws Exception {
Configuration config = new Configuration();
config.driverConfiguration()
.setDriverClassName("org.neo4j.ogm.drivers.http.driver.HttpDriver")
.setCredentials("neo4j", "xxxx")
.setURI("http://localhost:7474");
System.out.println(config);
SessionFactory sf = new SessionFactory(config, "domain");
Session session = sf.openSession();
final Neo4jTemplate neo4jTemplate = new Neo4jTemplate(session);
PlatformTransactionManager pt = new Neo4jTransactionManager(session);
final TransactionTemplate transactionTemplate = new TransactionTemplate(pt);
transactionTemplate.execute((TransactionCallback<Object>) transactionStatus -> {
Person p = new Person("Jim", 1);
p.worksWith(new Person("Jack", 2));
p.worksWith(new Person("Jane", 3));
neo4jTemplate.save(p, 2);
return p;
});
}
}
Моя сущность (присутствует в пакете домена) выглядит следующим образом:
@NodeEntity
public class Person {
@GraphId
private Long id;
private String name;
private Person() {
// Empty constructor required as of Neo4j API 2.0.5
}
;
public Person(String name, long id) {
this.id = id;
this.name = name;
}
/**
* Neo4j doesn't REALLY have bi-directional relationships. It just means when querying
* to ignore the direction of the relationship.
* https://dzone.com/articles/modelling-data-neo4j
*/
@Relationship(type = "TEAMMATE", direction = Relationship.UNDIRECTED)
public Set<Person> teammates;
public void worksWith(Person person) {
if (teammates == null) {
teammates = new HashSet<>();
}
teammates.add(person);
}
public String toString() {
return this.name + "'s teammates => "
+ Optional.ofNullable(this.teammates).orElse(
Collections.emptySet()).stream().map(
person -> person.getName()).collect(Collectors.toList());
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
Там нет симптома ошибки в журналах. Но когда я запрашиваю Neo4J с помощью веб-консоли, узлы не присутствуют.
Это легкая ловушка, в которую вы попадаете, и, как вы говорите, утомленный ученым. Хотя не все согласятся с этим подходом, я часто предоставляю setId(), который принимает примитив долго и проверяет, уже ли установлено свойство id или нет. Если id равен null, я устанавливаю значение, но если идентификатор не является нулевым, я просто регистрирую предупреждение, в котором говорится, что идентификатор уже установлен, и этот сеттер не предпринял никаких действий. Это позволяет легко тестировать устройство, когда вы хотите работать с объектами, где вы явно устанавливаете идентификатор (для удобства), но предотвращаете любые отрицательные побочные эффекты в реальном мире. –