我创建了一个包含Spring Data Neo4j类的数据访问层,可以在接口后面访问。
例如,我有一个Car接口和一个使用SDN注释的CarNode类,如@RelatedTo
:
@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 :(得分: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>
,但这不会破坏接口规则,因为它再次是公共接口隐藏的实现细节
答案 1 :(得分: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
了。