save()上的Spring Data Neo4j @RelatedToVia错误

时间:2013-08-23 03:07:13

标签: spring-data-neo4j

当我尝试保存具有@RelatedToVia属性的实体时,我收到以下错误:

org.springframework.dao.InvalidDataAccessApiUsageException: Null parameter, startNode=NodeImpl#1, endNode=null, type=DynamicRelationshipType[BPA_PROPOSITION]; nested exception is java.lang.IllegalArgumentException: Null parameter, startNode=NodeImpl#1, endNode=null, type=DynamicRelationshipType[BPA_PROPOSITION]

从上面的错误描述中,似乎我的RelationshipEntity缺少终端节点。但是,这是问题中最糟糕的部分,这不是真的,因为我随机得到了这个错误。

以下是该方案。我正在创建一些非常简单的测试来检查我的类映射。我手动创建每个测试用例所需的类,然后保存它们。由于Spring Data“级联”实体的持久性,我唯一关心的是用其原始属性和相关实体填充被测实体,保存它然后将其检索回来以查看数据是否存在。

这适用于我的前几个没有@RelatedToVia映射的类,但不适用于那些使用@RelatedToVia的类。以下是使用@RelatedToVia的代码的一些摘录。

@NodeEntity
public class BasicProbabilityAssignmentFunction {

@GraphId
private Long id;

@RelatedTo(type = RelTypeConstants.BPA_FRAME, direction = Direction.OUTGOING)
private FrameOfDiscernment frameOfDiscernment;

@RelatedToVia(type = RelTypeConstants.BPA_PROPOSITION, direction = Direction.OUTGOING, elementClass = Belief.class)
private Set<Belief> beliefs;

}

@RelationshipEntity
public class Belief {

@GraphId
private Long id;

@StartNode
private BasicProbabilityAssignmentFunction bpaFunction;

@EndNode
private Proposition proposition;

}

@NodeEntity
public class Proposition {

@GraphId
private Long id;

@RelatedTo(type= RelTypeConstants.PROPOSITION_HYPOTHESIS, direction= Direction.OUTGOING)
private Set<Hypothesis> hypotheses;

@RelatedTo(type = RelTypeConstants.FRAME_PROPOSITION, direction = Direction.INCOMING)
private FrameOfDiscernment frameOfDiscernment;

}

另外,这是在调用BasicProbabilityAssignmentFunction存储库之前,在debbuging模式下状态的变量状态的图像。请注意,Belief实体已完全填充!

enter image description here

还有用于测试的代码:

//this just creates an instance with its attributes populated
BasicProbabilityAssignmentFunction bpaFunction = BasicMockFactory.createBpaFunction();
//this is where I get the error.
bpaFunction = bpaFunctionRepository.save(bpaFunction);

进一步说明!在保存BasicProbabilityAssignmentFunction本身之前,我设法通过保存与BasicProbabilityAssignmentFunction相关的所有实体(例如,命题,假设等)来设法停止此错误。然而,我不确定为什么这解决了这个问题。

回答迈克尔评论:迈克尔,你是说应该在Belief类中定义rel-type(而不是使用@RelatedToVia注释的type属性),否则我应该使用template.createRelationshipBetween?我尝试使用@RelationshipEntity类型属性,但问题仍然存在。有用的是在@Startnode(BasicProbabilityAssignmentFunction)之前保存关系@EndNode(命题)。通过这样做,在保存BasicProbabilityAssignmentFunction时,可以毫无问题地创建(保存)Belief关系。