2014-02-14 66 views
1

我創建了一個包含Spring Data Neo4j類的數據訪問層,它們在接口的後面進行訪問。使@Fetch與接口一起工作

例如,我有一輛車的界面和使用SDN註解像@RelatedTo一個CarNode類:

@RelatedTo(elementClass = CarNode.class, type = "drives", direction = OUTGOING) 
private Set<Driver> drivers; 

如果你仔細觀察,你會發現@RelatedTo指CarNode類和drivers被定義爲Set<Driver>(而不是Set<DriverNode>)。

這工作正常。

現在我想用@Fetch啓用急切加載。

如果我簡單地做:

@RelatedTo(elementClass = CarNode.class, type = "drives", direction = OUTGOING) 
@Fetch 
private Set<Driver> drivers; 

我收到以下錯誤:

Type interface org.my.project.Driver is neither a @NodeEntity nor a @RelationshipEntity 

這是可能的,告訴@Fetch它應該期待DriverNode,就像它是可能的@RelatedTo當我們使用elementClass屬性?

我想避免打破我目前的架構。感謝您的提示!

回答

0

我發佈這個問題已經有一年多的時間了。再讀一遍,現在的問題對我來說顯而易見:我是完全是誤解和濫用elementClass屬性。當我寫道:

@RelatedTo(elementClass = CarNode.class, type = "drives", direction = OUTGOING) 
private Set<Driver> drivers; 

這是錯誤錯誤錯誤

我原來的問題的解決方案是使用字段聲明中的接口(private Set<Driver> drivers;)以及@RelatedTo的「elementClass」屬性中接口的具體實現。

這是現在的工作方式在我的項目:

@RelatedTo(elementClass = DriverNode.class, type = "drives", direction = OUTGOING) 
private Set<Driver> drivers = new HashSet<Driver>(0); 

所以,你必須使用DriverNode具體類的唯一的地方是裏面elementClass屬性。你根本不需要使用泛型。

腳註:我不再使用@Fetch

4

我遇到類似的問題,我解決它使用在Set領域的實現類,即

@RelatedTo(type = "drives", direction = OUTGOING) 
@Fetch private Set<DriverNode> drivers; 

畢竟drivers集合是私有的,因此這是一個實現細節。 以執行接口訪問,你可以聲明其返回/取像的接口類型的參數情況下,get/set方法:

public Set<? extends Driver> get Drivers() { 
    return drivers; 
} 

public void setDrivers(Set<? extends Driver> drivers) { 
    this.drivers = (Set<DriverNode>) drivers; 
} 

set方法,你必須在Set<Driver>集合轉換爲Set<DriverNode>,但是這並未」不會中斷接口規則,因爲它再次是公共接口隱藏的實現細節。

+0

嗨Remigio。我嘗試了你的想法,並且我得到了'類型不匹配:無法從集合轉換爲集合'。似乎沒有可能投出集合。你確定這是你用過的嗎? –

+0

我的錯,我用正確的代碼編輯了我的答案。 – remigio

+0

謝謝,這個工程。唯一的缺點是我的界面現在顯示'Set <?擴展SomeInterface>'這看起來並不像Set 那麼簡單。 –