Spring-Data-Neo4J:如何在关系中保存属性?

时间:2015-05-21 10:52:42

标签: java spring neo4j spring-data-neo4j

我创建了一个名为@RelationshipEntity的{​​{1}}。我实例化并创建一个新的HasContact关系:

HasContact

我的HasContact adminClerk = new HasContact (company, employee, "Admin Clerk") template.save (adminClerk); 课程如下:

RelationshipEntity

在上面的简单示例中,关系是持久的,由关系上的角色属性不是。任何想法为什么不,以及我如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

我怀疑这是3.x代码库中的一个错误 - 我遇到了同样的问题,我花了大约半天试图追踪这一点。

我的设置ID使用SpringBoot和Spring 4.1.6和Neo-Data 3.3.0.RELEASE(然后是3.4.0.M1)。 4.1.6春天显然存在一些问题,这是我第一个使用Neo4j的项目,所以我可能会错过一些东西,很高兴有人告诉我我错过了什么...

我观察到,对于保存的单个关系实体,有实际Neo4j db 的双重写入 - 第一个正确设置属性,第二个删除所有&# 34;额外"属性。

请参考以下摘自SourceStateTransmitter.java(3.4.0.M1)的是属性设置正确(第102/105行),然后由第109行的UpdateableState刷新覆盖。

   101 // todo take mapping policies for attributes into account
   102    persistentEntity.doWithProperties(new PropertyHandler<Neo4jPersistentProperty>() {
   103      @Override
   104      public void doWithPersistentProperty(Neo4jPersistentProperty property) {
   105          setEntityStateValue(property, entityState, wrapper, property.getMappingPolicy());
   106      }
   107    });
   108    if (target instanceof UpdateableState) {
   109       ((UpdateableState)target).flush();
   110    }

E.g。在第105行之后,检查Neo4j数据库根据需要显示与属性的关系,但是一旦第109行执行 - 它用一个只有一个属性(关系类型)的映射覆盖新创建的实体。

我尝试使用https://github.com/spring-projects/spring-data-neo4j中的最新3.x版本重新创建测试 - 但是,我尝试的测试使用的是ImpermanentGraphDatabase,在这种情况下并不等效。

当协议涉及与实际Neo4j数据库的通信时,entityStateHandler.useOrCreateState()最终创建2个具有不同属性映射的对象以写入该关系。关系属性最终被正确写入一个映射(例如,与与行102-105相关联的写入相关) - 但是当在第109行刷新目标时包含/使用的属性映射不相交(除了基本的关系类型/标签信息之外是空的。

当协议涉及ImpermanentGraphDatabase时,我假设它最终得到一个共享实例(例如,两个创建步骤产生相同的对象 - 在内存中与端点的实际REST通信),因此没有一致性问题。 / p>

所以我还没有能够产生一个打破这个问题的测试用例,但我仍然有理由相信这是一个错误。作为我对Spring-Data-Neo4j的新手,我确信可能会有一些我不知道的事情。

(嗯..想知道这在4.0中是否更好 - 这里没有提到http://projects.spring.io/spring-data-neo4j/。但是因为有一个新的重写似乎是未来的地方,不知道这是不是将得到修复)

答案 1 :(得分:0)

我总是成功保存与其中一个边缘端点上调用 relateTo 方法的属性的关系,即:

HasContact hasContact = company.relateTo(employee, HasContact.class, "HAS_CONTACT");

hasContact.setRole("Admin Clerk");