OtherWorldRelationship

OtherWorldRelationship

我已经建立了一个使用spring-data的项目,并成功创建了实体,并添加了与属性的关系。在关系属性值一经保留之后,除了更新关系属性值之外,其他所有方法似乎都运行良好。

为了尝试探索它,我合并了SpringData文档中的简单“ worlds”示例,并对其进行了增强。
在此示例中,存在一个与其他世界相关的世界实体。
我为此关系添加了一个名为“ yearsToReach”的属性。

在测试中,我创建了两个世界:火星和地球,并将yearsToReach设置为10。
然后,我调用WorldRepositoryService.updateYearsToOtherWorld并将yearsToReach设置为20。此方法以对第一个World的“保存”结束,但是当再次查询World时,它似乎并没有真正更改数据库中的值。

也许这真的很简单,但是我花了几个小时试图弄清楚我在做什么错...

这是我的代码,我删除了一些不相关的部分。
我非常感谢任何响应/代码示例。

这是我的“世界”实体(注意:“ BaseWorld”类未标记为@NodeEntity,仅包含“名称”属性)。


    @NodeEntity
    @盖特
    @Setter
    公共类World扩展BaseWorld {

        @GraphId
        私人Long ID;

        @RelatedToVia(类型= OtherWorldRelationship.RELATIONSHIP_TYPE,方向= Direction.OUTGOING,elementClass = OtherWorldRelationship.class)
        私人SetreachableByRocket = new HashSet();


        public void addRocketRouteTo(World otherWorld,in years yearsToReach){
            OtherWorldRelationship otherWorldRelationship = new OtherWorldRelationship();
            otherWorldRelationship.setWorld(this);
            otherWorldRelationship.setOtherWorld(otherWorld);
            otherWorldRelationship.setYearsToReach(yearsToReach);
            reachableByRocket.add(otherWorldRelationship);
        }

        public void updateYearsToOtherWorld(World otherWorld,int years){
            迭代器otherWorlds = reachableByRocket.iterator();
            而(otherWorlds.hasNext())
            {
                OtherWorldRelationship otherWorldRelationship = otherWorlds.next();
                如果(otherWorld.getName()。equals(otherWorldRelationship.getOtherWorld()。getName())){
                    otherWorldRelationship.setYearsToReach(years);
                    打破;
                }
            }
        }



这是关系类:


    @RelationshipEntity
    @盖特
    @Setter
    公共类OtherWorldRelationship {
        public static final String RELATIONSHIP_TYPE =“ OtherWorld”;

        @GraphId
        长ID;

        @StartNode
        私人世界世界;

        @EndNode
        私人世界otherWorld;

        private int yearsToReach;

    }



这是WorldRepository接口-它仅从GraphRepository继承


    公共接口WorldRepository扩展了GraphRepository,NamedIndexRepository {
    }



这是WorldRepositoryService:


    @资料库
    公共类WorldRepositoryService实现IWorldRepositoryService {

        @盖特
        @Setter
        @Autowired
        私有WorldRepository worldRepository;

        @Override
        @交易
        公共集合createSomeWorlds(){
            ArrayList newWorlds = new ArrayList();
            世界大地= createWorld(“ Earth”);
            newWorlds.add(earth);

            世界火星= createWorld(“火星”);
            mars.addRocketRouteTo(earth,10);
            newWorlds.add(mars);

            返回newWorlds;
        }

        @Override
        @交易
        公共世界createWorld(String name){
            返回worldRepository.save(new World(name));
        }

        @Override
        公共世界findWorldNamed(String name){
            返回worldRepository.findByPropertyValue(“ name”,name);
        }


        @Override
        @交易
        public World updateYearsToOtherWorld(世界火星,世界地球,国际年){
            mars.updateYearsToOtherWorld(地球,年);
            返回worldRepository.save(mars);
        }

    }



最后,这些是我测试的代码:


    @测试
        公共无效testNeo4JRelationshipUpdateData(){

            可迭代的世界= worldRepositoryService.createSomeWorlds(); //火星与地球

            世界地球= worldRepositoryService.findWorldNamed(“ Earth”);
            世界火星= 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());

            火星= worldRepositoryService.findWorldNamed(“火星”);
            distanceInYears = mars.getYearsToOtherWorld(earth);
            System.out.println(“更新后火星与地球之间的距离:” + distanceInYears);

            // !!!该行失败-它得到10个而不是20个! //
            Assert.assertEquals(20,distanceInYears.intValue());

        }

最佳答案

感谢jjaderberg的帮助-为了其他人,我正在粘贴解决方案:

解决方案是保存关系本身,而不是保存关系的实体。
这是固定的代码:

我为这种关系定义了新的存储库接口:


    公共接口OtherWorldRelationshipRepository扩展了GraphRepository,NamedIndexRepository {

    }



在WorldRepositoryService.clas中,我保存了关系而不是实体:


    @Override
        @交易
        public OtherWorldRelationship updateYearsToOtherWorld(世界火星,世界地球,国际年){
            OtherWorldRelationship yearsToOtherWorldRelation = mars.updateYearsToOtherWorld(earth,years);
            返回otherWorldRelationshipRepository.save(yearsToOtherWorldRelation);
        }



而已!!
希望它能像帮助自己一样帮助某人。

卡梅尔

10-08 01:47