2017-06-01 31 views
0

我正在進行一些Neo4J測試並運行以下特殊問題。我創建了一個我打算與OGM一起使用的小模型。該模型有一個超類Entity和一個Child類Child。他們都在包persistence.model。實體具有所需的Long id;與匹配的getId()吸氣劑。Neo4J OGM Session.load(ID)爲現有ID返回空對象

public abstract class Entity { 
    private Long id; 
    public Long getId() { 
     return id; 
    } 
} 

@NodeEntity 
Child extends Entity { 
    String name; 
    public Child() { 
    } 
} 

創建子對象並通過OGM保持它們工作正常。我基於文檔中的示例並使用Neo4jSessionFactory對象,該對象使用包persistence.model初始化SessionFactory。生成的數據庫包含具有正確ID的對象。

當我嘗試爲給定ID獲取子對象時出現問題。我用三種方法嘗試它,使用兩個連接系統(螺栓OGM):

boltSession.run("MATCH (a:Child) WHERE id(a) = {id} RETURN a", parameters("id", childId)); 

ogmSession.query("MATCH (a:Child) WHERE id(a) = $id RETURN a", params); 

ogmSession.load(Child.class, childId, 1); 

前兩種方法實際上返回正確的數據。最後一個返回空值。最後一個,使用OGM,有一些明顯的好處,我希望能夠正確使用它。任何人都可以將我指向正確的方向嗎?

+0

是否有可能提供可重現的測試用例?我已經嘗試過你在這裏描述的內容 - https://github.com/neo4j-examples/neo4j-sdn-ogm-issue-report-template/tree/so-44305093/so-44305093,它按預期工作(即收益節點)。 –

+0

我在這裏用最少的代碼創建了一些測試用例:https://github.com/CountZukula/neo4j-ogm-bug-test-case-template。只需在數據庫中添加一個Child對象,在ogm.properties和Neo4JBolt.java中修改用戶名/密碼,並在TestMain.java類中設置新對象的ID。在我的情況下,只有ogmLoad()測試用例失敗。另外兩個人成功了。提前致謝! – CountZukula

回答

1

在您的測試代碼中,您正在通過int類型的ID進行查找。

private int someIdInYourDatabase = 34617; 

Neo4j中的內部ID是Long類型的。

如果您將ID的類型更改爲longLong那麼它將起作用。

private long someIdInYourDatabase = 34617; 
+0

我本來可以知道這是愚蠢的。感謝您花時間!作爲旁註:是否有一個合理的原因,爲什麼java接口允許任何'ID'對象傳遞給'session.load()'?除了「長」之外還有其他ID嗎? – CountZukula

+1

是的,您可以使用「@Index(primary = true)」註釋屬性,例如的String類型,然後你可以使用session.load(x,「some string id」)來查找屬性。 –