我已经建立了一个使用 spring-data 并成功创建实体、添加与属性的关系的项目。除了更新关系属性值外,一切似乎都运行良好,一旦它们被持久化。
为了尝试探索它,我合并了 SpringData 文档中的简单“世界”示例并对其进行了一些改进。在此示例中,有一个与其他世界相关的 World 实体。我在这种关系中添加了一个名为“yearsToReach”的属性。
在我的测试中,我创建了两个世界:火星和地球,并将 yearsToReach 设置为 10。然后,我调用 WorldRepositoryService.updateYearsToOtherWorld 并将 yearsToReach 设置为 20。此方法以第一个 World 的“保存”结束,但在查询再次世界,它似乎并没有真正改变数据库中的值。
也许这真的很简单,但我只是花了几个小时试图找出我做错了什么......
这是我的代码,我删除了一些不相关的部分。我非常感谢任何响应/代码示例。
这是我的“世界”实体(注意:“BaseWorld”类未标记为@NodeEntity,它仅包含“名称”属性)。
@NodeEntity
@Getter
@Setter
公共类 World 扩展 BaseWorld {
@GraphId
私人长ID;
@RelatedToVia(type = OtherWorldRelationship.RELATIONSHIP_TYPE, direction = Direction.OUTGOING, elementClass = OtherWorldRelationship.class)
私有 SetreachableByRocket = new HashSet();
公共无效 addRocketRouteTo(世界其他世界,int yearsToReach){
OtherWorldRelationship otherWorldRelationship = new OtherWorldRelationship();
otherWorldRelationship.setWorld(this);
otherWorldRelationship.setOtherWorld(otherWorld);
otherWorldRelationship.setYearsToReach(yearsToReach);
reachableByRocket.add(otherWorldRelationship);
}
public void updateYearsToOtherWorld(世界其他世界,整数年){
迭代器 otherWorlds = reachableByRocket.iterator();
而 (otherWorlds.hasNext() )
{
其他世界关系 otherWorldRelationship = otherWorlds.next();
if (otherWorld.getName().equals(otherWorldRelationship.getOtherWorld().getName())){
otherWorldRelationship.setYearsToReach(年);
休息;
}
}
}
这是关系类:
@RelationshipEntity
@Getter
@Setter
公共类 OtherWorldRelationship {
public static final String RELATIONSHIP_TYPE = "OtherWorld";
@GraphId
长身份证;
@StartNode
私人世界世界;
@EndNode
私人世界另一个世界;
私人 int yearsToReach;
}
这是 WorldRepository 接口- 它只继承自 GraphRepository
公共接口 WorldRepository 扩展 GraphRepository,NamedIndexRepository {
}
这是WorldRepositoryService:
@Repository
公共类 WorldRepositoryService 实现 IWorldRepositoryService {
@Getter
@Setter
@自动连线
私有世界存储库世界存储库;
@覆盖
@Transactional
公共集合 createSomeWorlds() {
ArrayList newWorlds = new ArrayList();
世界地球 = createWorld("地球");
newWorlds.add(地球);
世界火星 = createWorld("火星");
mars.addRocketRouteTo(地球, 10);
newWorlds.add(火星);
返回新世界;
}
@覆盖
@Transactional
公共世界创建世界(字符串名称){
return worldRepository.save(new World(name));
}
@覆盖
公共世界findWorldNamed(字符串名称){
return worldRepository.findByPropertyValue("name", name);
}
@覆盖
@Transactional
public World updateYearsToOtherWorld(世界火星,世界地球,整数年){
mars.updateYearsToOtherWorld(地球,年);
返回 worldRepository.save(mars);
}
}
最后,这些是我的测试中的行:
@测试
公共无效 testNeo4JRelationshipUpdateData() {
Iterable worlds = worldRepositoryService.createSomeWorlds();//火星和地球
世界地球 = worldRepositoryService.findWorldNamed("地球");
世界火星 = worldRepositoryService.findWorldNamed("Mars");
整数距离InYears = 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);
// !!! 这条线失败了 - 它得到 10 而不是 20 !!! //
Assert.assertEquals(20, distanceInYears.intValue());
}