spring-data を使用するプロジェクトを構築し、エンティティを作成し、プロパティとの関係を追加することに成功しました。リレーションシップ プロパティの値がいったん永続化された後、その値を更新することを除いて、すべてが正常に実行されているようです。
それを探求するために、SpringData のドキュメントから単純な「世界」の例をマージし、少し拡張しました。この例では、他のワールドに関連する World エンティティがあります。この関係に「yearsToReach」というプロパティを追加しました。
私のテストでは、火星と地球の 2 つの世界を作成し、yearsToReach を 10 に設定します。次に、WorldRepositoryService.updateYearsToOtherWorld を呼び出し、yearsToReach を 20 に設定します。このメソッドは、最初の World の「保存」で終了しますが、データベースの値を実際に変更しているようには見えません。
多分それは本当に簡単ですが、私は何が間違っているのかを理解しようと何時間も費やしました...
これが私のコードです。関連のない部分をいくつか削除しました。応答/コード例に感謝します。
これは私の 'World' エンティティです (注: 'BaseWorld' クラスは @NodeEntity としてマークされておらず、'name' プロパティのみを含んでいます)。
@NodeEntity @ゲッター @セッター public class World は BaseWorld を拡張します { @GraphId プライベート ロング ID。 @RelatedToVia(type = OtherWorldRelationship.RELATIONSHIP_TYPE, direction = Direction.OUTGOING, elementClass = OtherWorldRelationship.class) private Set reachableByRocket = new HashSet(); public void addRocketRouteTo(World otherWorld, int yearsToReach) { OtherWorldRelationship otherWorldRelationship = new OtherWorldRelationship(); otherWorldRelationship.setWorld(これ); otherWorldRelationship.setOtherWorld(otherWorld); otherWorldRelationship.setYearsToReach(yearsToReach); reachableByRocket.add(otherWorldRelationship); } public void updateYearsToOtherWorld(World otherWorld, int years) { イテレータ otherWorlds = reachableByRocket.iterator(); while (otherWorlds.hasNext() ) { OtherWorldRelationship otherWorldRelationship = otherWorlds.next(); if (otherWorld.getName().equals(otherWorldRelationship.getOtherWorld().getName())){ otherWorldRelationship.setYearsToReach(年); 壊す; } } }
これはリレーションシップ クラスです。
@RelationshipEntity @ゲッター @セッター public class OtherWorldRelationship { public static final String RELATIONSHIP_TYPE = "OtherWorld"; @GraphId 長い ID; @StartNode プライベート ワールド ワールド; @エンドノード プライベートワールド otherWorld; プライベート int yearsToReach; }
これは WorldRepository インターフェイスです- GraphRepository からのみ継承します
パブリック インターフェイス WorldRepository は、GraphRepository、NamedIndexRepository を拡張します { }
そして、これはWorldRepositoryServiceです:
@リポジトリ public class WorldRepositoryService は IWorldRepositoryService を実装します { @ゲッター @セッター @Autowired プライベート WorldRepository worldRepository; @オーバーライド @トランザクション パブリック コレクション createSomeWorlds() { ArrayList newWorlds = new ArrayList(); 世界の地球 = createWorld("地球"); newWorlds.add(地球); 世界の火星 = createWorld("火星"); mars.addRocketRouteTo(地球、10); newWorlds.add(火星); newWorlds を返します。 } @オーバーライド @トランザクション public World createWorld(文字列名) { return worldRepository.save(新しいワールド(名前)); } @オーバーライド public World findWorldNamed(文字列名) { return worldRepository.findByPropertyValue("名前", 名前); } @オーバーライド @トランザクション public World updateYearsToOtherWorld(世界の火星、世界の地球、整数年) { mars.updateYearsToOtherWorld(地球、年); return worldRepository.save(火星); } }
最後に、これらは私のテストからの行です:
@テスト public void testNeo4JRelationshipUpdateData() { Iterable worlds = worldRepositoryService.createSomeWorlds();//火星と地球 世界の地球 = worldRepositoryService.findWorldNamed("地球"); 世界の火星 = worldRepositoryService.findWorldNamed("火星"); Integer distanceInYears = mars.getYearsToOtherWorld(earth); System.out.println("火星と " + distanceInYears の間の距離); Assert.assertEquals(10, distanceInYears.intValue()); 火星 = worldRepositoryService.updateYearsToOtherWorld(火星、地球、20); System.out.println("火星と地球の間の距離: " + distanceInYears); Assert.assertEquals(20, distanceInYears.intValue()); mars = worldRepositoryService.findWorldNamed("Mars"); distanceInYears = mars.getYearsToOtherWorld(地球); System.out.println("更新後の火星と地球の距離: " + distanceInYears); // !!! この行は失敗します - 20 ではなく 10 になります!!! /// Assert.assertEquals(20, distanceInYears.intValue()); }