我已经建立了一个使用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);
}
而已!!
希望它能像帮助自己一样帮助某人。
卡梅尔