gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 11:31:03 25 4
gpt4 key购买 nike

我创建了一个名为 HasContact@RelationshipEntity。我实例化并创建一个新的 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 ***/

...
}

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

最佳答案

我怀疑这是 3.x 代码库中的一个错误——我遇到了同样的问题,我花了大约半天的时间试图找出这个问题。

我的设置 ID 使用 SpringBoot 和 Spring 4.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 刷新覆盖。

   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,在本例中它并不等效。

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

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

所以我无法生成一个测试用例来打破这个问题,但我仍然相当确定这是一个错误。由于我是 Spring-Data-Neo4j 的新手,我确信可能会遗漏一些东西。

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

关于java - Spring-Data-Neo4J:如何保存关系上的属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30371633/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com