我收到以下錯誤,當我嘗試保存具有@RelatedToVia屬性的實體:上的保存()春季數據的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數據「級聯」了實體的持久性,我唯一擔心的是使用它的基本屬性和相關實體來填充被測實體,保存並重新獲取它以查看數據是否存在。
這對我的前幾個類沒有@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模式下的變量狀態的圖像。請注意,信仰實體已經完全填充!
,也可用於測試代碼:
//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相關的所有實體(例如Proposition,Hypothesis等),我設法停止了這個錯誤。儘管如此,我不知道爲什麼這解決了這個問題。
接聽邁克爾評論:邁克爾,你說,REL-類型應該在信仰類本身(而不是使用@RelatedToVia註釋的type屬性)來定義或以其他方式我應該使用template.createRelationshipBetween?我試圖使用@RelationshipEntity類型屬性,但問題仍然存在。有用的是在@Startnode(BasicProbabilityAssignmentFunction)之前保存關係@EndNode(Proposition)。通過這樣做,當BasicProbabilityAssignmentFunction被保存時,信念關係被創建(保存)而沒有問題。
另外,還要確保如果添加'Beliefs',他們的所有3場(開始節點,終端節點和rel類型)被填充。否則,您也可能直接保存關係實體或使用'template.createRelationshipBetween()' –