首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Spring-Data-Neo4J:如何保存关系的属性?

Spring-Data-Neo4J:如何保存关系的属性?
EN

Stack Overflow用户
提问于 2015-05-21 18:52:42
回答 2查看 598关注 0票数 0

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

代码语言:javascript
复制
HasContact adminClerk = new HasContact (company, employee, "Admin Clerk")
template.save (adminClerk);

我的RelationshipEntity类如下所示:

代码语言:javascript
复制
@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 ***/

    ...
}

在上面的简单示例中,关系是持久化的,而不是关系上的角色属性。有什么不同的想法吗?我该如何解决这个问题?

EN

回答 2

Stack Overflow用户

发布于 2015-06-19 04:44:53

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

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

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

请参考下面摘自SourceStateTransmitter.java (3.4.0.M1)的内容,即属性被正确设置(在第102/105行附近),然后被第109行上的UpdateableState刷新覆盖。

代码语言:javascript
复制
   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()最终创建两个对象,这两个对象具有不同的属性映射以写入关系。关系属性最终被正确地写入一个映射(例如,关于与行102-105相关联的写入)--但是当在行109上刷新目标时,该映射与所包含/使用的属性映射不相交(其在基本关系类型/标签信息之外是空的)。

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

因此,我还不能生成一个测试用例来打破这一点,但我仍然相当确定这是一个bug。由于我是Spring-Data-Neo4j的新手,我相信我可能会遗漏一些东西。

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

票数 1
EN

Stack Overflow用户

发布于 2015-05-23 15:46:36

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

代码语言:javascript
复制
HasContact hasContact = company.relateTo(employee, HasContact.class, "HAS_CONTACT");

hasContact.setRole("Admin Clerk");
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30371633

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档