【问题标题】:Spring with Neo4j, GraphRepository<?> vs handmade interfaceSpring with Neo4j, GraphRepository<?> vs 手工界面
【发布时间】:2013-07-21 13:15:33
【问题描述】:

我发现有一个叫GraphRepository的接口。我有一个用于实现自制接口的用户存储库,该接口可以完成其工作,但我想知道,我不应该实现 GraphRepository 吗?即使实现起来会很长,有些方法没用,但我认为这是一个标准,我已经重新编写了很多在这个接口中定义的方法。

那么我应该编写“YAGNI”代码还是不遵守标准? 你有什么建议?

【问题讨论】:

    标签: spring neo4j repository-pattern spring-data-neo4j


    【解决方案1】:

    您不需要实际实现 GraphRepository 而是扩展它。 Spring-Data 的原则是所有样板 CRUD 代码都得到处理(通过在启动时代理)所以你所要做的就是为扩展 GraphRepository 的特定实体创建一个接口,然后只添加你的特定方法需要。

    例如;如果我有一个实体 CustomerNode,要创建标准 CRUD 方法,我可以创建一个新接口 CustomerNodeRepository extends GraphRepository&lt;CustomerNode,Long&gt;GraphRepository 中的所有方法(例如 save、findAll、findOne、delete、deleteAll 等)现在都可以从 CustomerNodeRepository 访问并由 Spring-Data-Neo4J 实现,而无需编写一行实现代码。

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

    Spring-Data 包对于存储库交互非常有用。它可以减少大量代码(代码行减少了 80% 以上),强烈推荐使用它

    编辑:实现自定义执行

    如果您想将自己的自定义行为添加到 Repository 方法,您需要创建合并接口和自定义实现的概念。例如,假设我想创建一个名为 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我们的“自定义”接口
    • 我们在实现自定义接口的类中实现“自定义”方法
    • “自定义”实现类必须(默认)称为我们的“主”接口Impl 才能被 Spring Data 拾取(因此在本例中为CustomNodeRepositoryImpl

    在幕后,Spring Data 提供了 CustomerNodeRepository 的代理实现,作为自动构建的 GraphRepository 和实现 CustomCustomerNodeRepository 的类的合并。类名的原因是允许 Spring Data 轻松/成功地拾取它(这个 可以 被覆盖,因此它不会寻找 *Impl)

    【讨论】:

    • 有些东西我不明白,我创建了一个扩展 GraphRepository 的接口 iUserRepository 和一个实现 iUserRepository 的类 Neo4jUserRepository,但是我的 IDE (IntelliJ) 强制我覆盖 GraphRepository 的所有方法(因为它们是摘要),我哪里错了?
    • Spring Data 的想法是您实际上并没有实现 GraphRepository 接口(您的扩展或任何其他衍生产品)。有一种用于在模式中创建自定义执行的模式,我可以扩展答案以证明您是否喜欢
    • 我愿意。我找到了多个关于它如何工作的示例,但是如果我们不实现抽象方法,我不明白它如何编译。
    • 抽象方法在哪里声明?在您的自定义或GraphRepository
    • 感谢您的精确度,但关键是在您的情况下,CustomNodeRepositoryImpl 实现了 CustomNodeRepository(它扩展了 GraphRepository),因此知道 GrahpReposiroty 方法是抽象的,我的代码将无法编译,因为我没有覆盖 GraphRepository 方法在 CustomNodeRepositoryImpl 中。
    猜你喜欢
    • 2014-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-11
    • 2023-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多