2017-02-01 823 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; 
    } 
} 

有沒有在日誌中沒有任何錯誤的症狀。但是當我使用Web控制檯查詢Neo4J時,沒有節點存在。

回答

2

在更多研究中,發現問題在於@GraphId字段不應該被設置爲值。

解釋這裏: Spring Neo4j not save data

硬盤教訓:永遠不要手動設置@GraphId。

+1

這是一個容易陷入陷阱,並且正如你所說,一個艱難lessased瞭解。 雖然不是每個人都會同意這種方法,但我經常提供一個setId(),它使用一個很長的基元並檢查id屬性是否已經設置。如果id爲空,我會設置該值,但是,如果id不爲null,則只需記錄一條警告,說明id已被設置,並且此setter不採取任何行動。當您想要與顯式設置ID的實體(爲了方便起見)一起工作時,這樣可以輕鬆進行單元測試,但可以防止在實際應用中出現任何負面影響。 –

相關問題