0

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

        }

4

3 に答える 3

0

おっしゃる通りです。「distanceInYears」を読み直すのを忘れていました。残念ながら、これでは問題は解決しません...値はまだ10です。両方のアサーションが失敗します(最初のアサーションにコメントすると、「火星」を再度取得しようとしているもう1つのアサーションも失敗します)。

正しいテスト コードは次のようになります。

    @テスト
        public void testNeo4JRelationshipUpdateData() {

            worldRepositoryService.deleteAll();

            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);
            distanceInYears = mars.getYearsToOtherWorld(地球);

            /* これは失敗するアサーションです: */
            System.out.println("火星と地球の間の距離: " + distanceInYears);
            Assert.assertEquals(20, distanceInYears.intValue());

            /* 前の 2 行をコメント化すると、これも失敗します: */
            mars = worldRepositoryService.findWorldNamed("Mars");
            distanceInYears = mars.getYearsToOtherWorld(地球);
            System.out.println("更新後の火星と地球の距離: " + distanceInYears);
            Assert.assertEquals(20, distanceInYears.intValue());

        }

于 2013-11-11T07:18:40.357 に答える