Spring与Neo4j,GraphRepository<?>与手写接口的比较

4

我发现有一个叫做GraphRepository的接口。我有一个为用户实现自制接口的存储库,它能够胜任其工作,但我在想,我是否应该实现GraphRepository呢?即使这将花费很长时间来实现,并且有些方法可能是无用的,但我认为这是一种标准,而且我已经重新编码了很多在此接口中定义的方法。

所以我应该写“YAGNI”代码还是遵守标准?你有什么建议吗?

1个回答

11

您无需实际实现GraphRepository,只需扩展它即可。Spring-Data的原则是通过代理启动时间来处理所有样板文件CRUD代码,因此您只需为特定实体创建一个扩展GraphRepository的接口,然后仅添加所需的特定方法。

例如;如果我有一个实体CustomerNode,要创建标准的CRUD方法,我可以创建一个新接口CustomerNodeRepository扩展GraphRepository<CustomerNode,Long>。现在可以从CustomerNodeRepository访问GraphRepository的所有方法(例如save、findAll、findOne、delete、deleteAll等),而不必编写一行实现代码,Spring-Data-Neo4J会为我们实现这些方法。

现在该模式允许您专注于特定存储库代码(例如findByNameAndDateOfBirth),而不是简单的CRUD内容。

Spring-Data包对存储库交互非常有用。它可以减少大量代码(看到过80%以上的代码行数减少),强烈建议使用它。

编辑:实施自定义执行

如果想要向存储库方法添加自定义行为,则需要创建合并接口和自定义实现的概念。例如,假设我想创建一个名为findCustomerNodeBySomeStrangeCriteria的方法,并且为此我实际上想链接到关系数据库执行该函数。

首先,我们定义一个单独的、独立的接口,它仅包括我们的“额外”方法。

public interface CustomCustomerNodeRepository {
   List<CustomerNode> findCustomerNodeBySomeStrangeCriteria(Object strangeCriteria);
}

接下来,我们将更新我们的普通接口,不仅扩展GraphRepository,还要扩展我们的新自定义接口。

public interface CustomerNodeRepository extends GraphRepository<CustomerNode,Long>, CustomCustomerNodeRepository {

}

最后一步是实际实现我们的findCustomerNodeBySomeStrangeCriteria方法。

public class CustomerNodeRepositoryImpl implements CustomCustomerNodeRepository {

   public List<CustomerNode> findCustomerNodeBySomeStrangeCriteria(Object criteria) {
    //implementation code
}

}

所以,有几个要点需要注意:

  • 我们创建了一个单独的接口来定义任何具有自定义实现的自定义方法(与Spring-Data兼容的“findBy…”方法不同)
  • 我们的CustomerNodeRepository接口(我们的“主”接口)扩展了GraphRepository 我们的'custom'接口
  • 我们仅在实现自定义接口的类中实现'custom'方法
  • 'custom'实现类必须(默认情况下)称为我们的'main'接口Impl,以被Spring Data选中(因此在这种情况下为CustomNodeRepositoryImpl

在幕后,Spring Data会将自动构建的GraphRepository和我们实现的CustomCustomerNodeRepository类合并成CustomerNodeRepository的代理实现。该类名称的原因是为了使Spring Data能够轻松/成功地找到它(这可以被覆盖,以便它不再寻找*Impl)。


有点不太明白,我创建了一个继承GraphRepository<User>的接口iUserRepository和一个实现iUserRepository的类Neo4jUserRepository,但我的IDE (IntelliJ) 强制我覆盖GraphRepository的所有方法(因为它们都是抽象方法),我错在哪里了? - user2137101
1
Spring Data 的理念是,您实际上不需要实现 GraphRepository 接口(无论是您的扩展还是任何其他派生接口)。在该模式中,有一种创建自定义执行的模式,如果您愿意,我可以扩展答案以进行演示。 - incomplete-co.de
我想了解。我找到了多个关于它如何工作的例子,但如果我们不实现抽象方法,我不明白它是如何编译的。 - user2137101
抽象方法在哪里声明?是在您的自定义类还是GraphRepository中? - incomplete-co.de
谢谢您的精准解释,但问题在于在您的情况下,CustomNodeRepositoryImpl实现了CustomNodeRepository(扩展了GraphRepository),因此知道GrahpReposiroty方法是抽象的,我的代码不会编译,因为我没有在CustomNodeRepositoryImpl中覆盖GraphRepository方法。 - user2137101
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接