我创建了一个名为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 ***/
...
}在上面的简单示例中,关系是持久化的,而不是关系上的角色属性。有什么不同的想法吗?我该如何解决这个问题?
发布于 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刷新覆盖。
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/没有提到。但由于有一个新的重写,似乎是未来的地方,不确定这是否会得到修复)
发布于 2015-05-23 15:46:36
我总是成功地保存了与在其中一个边缘端点上调用relateTo方法的属性的关系,即:
HasContact hasContact = company.relateTo(employee, HasContact.class, "HAS_CONTACT");
hasContact.setRole("Admin Clerk");https://stackoverflow.com/questions/30371633
复制相似问题