使@Fetch与接口一起工作

时间:2014-02-14 15:32:20

标签: java spring neo4j spring-data-neo4j

我创建了一个包含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一样?

我想避免破坏我目前的架构。谢谢你的提示!

2 个答案:

答案 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了。