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());
}