2017-02-01 8 views
0

Новичок для 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 с помощью веб-консоли, узлы не присутствуют.

ответ

2

В еще одном исследовании выяснилось, что поле @GraphId никогда не должно устанавливаться.

Разъяснения здесь: Spring Neo4j not save data

Жесткий урок: Никогда, никогда установить @GraphId вручную.

+1

Это легкая ловушка, в которую вы попадаете, и, как вы говорите, утомленный ученым. Хотя не все согласятся с этим подходом, я часто предоставляю setId(), который принимает примитив долго и проверяет, уже ли установлено свойство id или нет. Если id равен null, я устанавливаю значение, но если идентификатор не является нулевым, я просто регистрирую предупреждение, в котором говорится, что идентификатор уже установлен, и этот сеттер не предпринял никаких действий. Это позволяет легко тестировать устройство, когда вы хотите работать с объектами, где вы явно устанавливаете идентификатор (для удобства), но предотвращаете любые отрицательные побочные эффекты в реальном мире. –

 Смежные вопросы

  • Нет связанных вопросов^_^