SDN 4-RC1:RelationRepository.save(relationshipEntity)不保存Graph中的RelationshipEntities

时间:2015-07-21 13:56:53

标签: java cypher spring-data-neo4j spring-data-neo4j-4

要使用neo4j-graphdatabase独立服务器,我将SDN 4.0.0.RC1的依赖项添加到我的pom:

    <dependency>
        <groupId>org.springframework.data</groupId>
        <artifactId>spring-data-neo4j</artifactId>
        <version>4.0.0.RC1</version>
        <exclusions>
            <exclusion>
                <groupId>org.neo4j.app</groupId>
                <artifactId>neo4j-server</artifactId>
            </exclusion>
        </exclusions>
    </dependency>

在我的应用程序中,我想管理家庭。人为NodeEntities,关系类型为NodeEntities,家庭关系为RelationshipEntities。

要保存节点或关系,请使用repository.save(T t) (repository extends GraphRepository<T>)。这适用于所有节点,但不适用于关系。

显式无效代码:

    Relation createdRelation = new Relation(typeName, from, to, getCurrentUsername());
    createdRelation.setBegin(begin);
    createdRelation.setEnd(end);
    Relation relation = relationRepository.save(createdRelation);

我从save(T t)返回一个Relation-Object。 但是RelationshipEntity不会在图形数据库中保留。我的Relation-Object也没有任何id。

RelationshipEntity类如下所示:

@RelationshipEntity(type = "RELATION")
public class Relation extends BaseMutableGraphEntity {

@Property
private String type;

@StartNode
private Person fromPerson;

@EndNode
private Person toPerson;

private Relation() {
}

...getters and setters...}

graph-id保存在BaseClass中:

public abstract class BaseGraphEntity implements AuditEntity {

@GraphId
private Long id;

...with getters and setters...}

我现在的问题是:

如何使用Spring Data Neo4j 4 RC1保存我的RelationshipEntities?

RelationshipEntities还有其他存储库吗?

P.S。:我试图将我的graph-id的位置更改为主要的RelationshipEntity,但它不起作用。

3 个答案:

答案 0 :(得分:2)

我也遇到了这个怪癖,能够通过以下方式坚持我的关系:

  • @StartNode实体
  • 上设置您的关系
  • 保存@StartNode实体或@RelationshipEntity,似乎关键是必须首先在@StartNode上设置对象

因此,在您的示例中,您必须执行以下操作:

Relation createdRelation = new Relation(typeName, from, to, getCurrentUsername());
createdRelation.setBegin(begin);
createdRelation.setEnd(end);
begin.setRelation(createdRelation);
Relation relation = relationRepository.save(createdRelation);

所有人都说我必须承认,我不能100%确定这是否是它要完成的方式,因为在当前的文档修订中并不清楚但是它似乎确实是在SDN4示例测试: this CodePen(见findOneShouldConsiderTheEntityType

答案 1 :(得分:2)

您所看到的是对象图(您的域模型)与您期望的实际图形不对应的事实。

Relation createdRelation = new Relation(typeName, from, to, getCurrentUsername());
    createdRelation.setBegin(begin);
    createdRelation.setEnd(end);
    Relation relation = relationRepository.save(createdRelation);

这里,关系实体正确地表示与起始节点和结束节点的关系。现在,如果你试图导航这个&#34;对象图&#34;到开始实体,即begin,您发现无法通过关系导航到最终实体end

当实体被持久化时,遍历对象图以确定新内容或修改内容并保留它们。在这种情况下,当遍历到达您的起始节点时,它找不到与其他节点的关系,并且实际上,应该创建的这种关系不是。

Simon的代码之所以有效,是因为他使实体图与物理图形一致。然后,您可以保存最后的实体或关系实体本身。

如果您根据图形来考虑对象,那么这一切都将落实到位。

答案 2 :(得分:0)

这是解决我问题的代码,谢谢 simonl

Relation relation = new Relation(typeName, from, to, getCurrentUsername());
relation.setBegin(begin);
relation.setEnd(end);
from.addOutgoingRelation(relation);
personRepository.save(from);
return createResponseBuilder.build(relation);

...我将我的代码更改为

Relation relation = new Relation(typeName, from, to, getCurrentUsername());
relation.setBegin(begin);
relation.setEnd(end);
from.addOutgoingRelation(relation);
return createResponseBuilder.build(relationRepository.save(relation));

由于 Luannes 的评论,谢谢你!