繁体   English   中英

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

[英]Spring-Data-Neo4J: How do I save a property on a relationship?

我创建了一个@RelationshipEntity称为HasContact 我实例化并创建一个新的HasContact关系,如下所示:

HasContact adminClerk = new HasContact (company, employee, "Admin Clerk")
template.save (adminClerk);

我的RelationshipEntity类如下所示:

@RelationshipEntity(type="HAS_CONTACT")
public class HasContact {

    @GraphId
    Long id;

    @StartNode
    Company company;

    @EndNode
    Employee employee;

    String role;

    public HasContact() {
        // Empty Constructor
    }

    public HasContact(Company company, Employee employee, String role) {
        this.company = company
        this.employee = employee
        this.role = role;
    }

    /*** Gettes and Setters ***/

    ...
}

在上面的简单示例中,关系是持久的,而关系上的role属性则不是。 有什么想法为什么不可以,我该如何解决?

我怀疑这是3.x代码库中的错误 -我遇到了同样的问题,并且花了大约半天的时间来进行跟踪。

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

我观察到的是,对于保存的单个关系实体, 实际的Neo4j db有两次写入操作-第一个正确设置属性,第二个擦除所有“额外”属性。

请从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    }

例如,在第105行之后,检查Neo4j数据库显示了具有所需属性的关系,但是一旦执行了109行,它将使用具有完全一个属性(关系类型)的映射覆盖新创建的实体。

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

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

当协议涉及ImpermanentGraphDatabase时,我假设它以共享实例结束(例如,两个创建步骤都在内存中生成相同的对象-与端点的实际REST通信),因此不存在一致性问题。

因此,我无法生成打破此问题的测试用例,但我仍然有理由确定这是一个错误。 因为我是Spring-Data-Neo4j的新手,所以我确定可能会缺少一些东西。

(嗯..想知道这在4.0中是否更好-在这里没有提到http://projects.spring.io/spring-data-neo4j/ 。但是因为有一个新的重写似乎是未来的方向是,不确定是否会解决此问题)

我一直成功地保存了在边缘端点之一上调用属性为relatedTo方法的关系,即:

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

hasContact.setRole("Admin Clerk");

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM