2013-08-23 53 views
1

我收到以下錯誤,當我嘗試保存具有@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模式下的變量狀態的圖像。請注意,信仰實體已經完全填充!

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相關的所有實體(例如Proposition,Hypothesis等),我設法停止了這個錯誤。儘管如此,我不知道爲什麼這解決了這個問題。

接聽邁克爾評論:邁克爾,你說,REL-類型應該在信仰類本身(而不是使用@RelatedToVia註釋的type屬性)來定義或以其他方式我應該使用template.createRelationshipBetween?我試圖使用@RelationshipEntity類型屬性,但問題仍然存在。有用的是在@Startnode(BasicProbabilityAssignmentFunction)之前保存關係@EndNode(Proposition)。通過這樣做,當BasicProbabilityAssignmentFunction被保存時,信念關係被創建(保存)而沒有問題。

+0

另外,還要確保如果添加'Beliefs',他們的所有3場(開始節點,終端節點和rel類型)被填充。否則,您也可能直接保存關係實體或使用'template.createRelationshipBetween()' –

回答

0
+0

從[https://jira.springsource.org/browse/DATAGRAPH-216](https://jira.springsource.org/browse/DATAGRAPH-216)似乎這個問題已經在我正在使用的2.2版本中解決了。另外,正如你可能注意到的那樣,錯誤是隨機的。我認爲這可能與實體保存的順序有關。看起來有時候彈簧數據不會選擇正確的順序。但是不確定。 – pasemes

+1

總之,直接保存關係實體會更好,然後創建關係並在實體的下一次加載時可用。 –