2017-02-01 15 views
0

新生児をSDNおよびNeo4jに保存します。 sdnバージョン:4.1.6.RELEASEを使用)とneo4jバージョン:3.1.0。Springデータ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

これは簡単な落とし穴で、あなたが言うように、難解な学習をしました。 誰もがこのアプローチに同意するわけではありませんが、私はしばしばプリミティブなlongをとり、idプロパティがすでに設定されているかどうかを調べるsetId()を提供します。 idがnullの場合は値を設定しますが、idがnullでない場合は、IDがすでに設定されていて、このセッターが何の動作もしていないという警告が記録されます。これにより、IDを明示的に設定したエンティティ(便宜上)で作業したいが、実世界での負の副作用を防ぐために、単体テストを簡単に行うことができます。 –

関連する問題