【问题标题】:Why is Spring Data's MongoRepository so limited?为什么 Spring Data 的 MongoRepository 如此有限?
【发布时间】:2013-07-23 05:51:11
【问题描述】:

所以我注意到 Spring Data 的 MongoTemplate 有很多不同类型的“保存对象”操作,例如 save、upsert、insert 和 updateFirst。

另一方面,Spring Data 的 MongoRepository 接口有一个持久化方法:“save”。现在,显然,如果我想要创建/更新/更新插入功能,我可以很容易地实现它们。只需在调用“保存”之前执行一次获取并检查实体是否存在。但是 MongoTemplate 有如此多的选项似乎很奇怪(我什至无法弄清楚 save 和 upsert 之间的区别是什么),但是 Spring Data 的 repos 是如此有限。

如果您要使用创建/更新语义,您是否认为使用 Spring Data MongoRepositories 而不自定义其方法是浪费/懒惰,或者是 get + null check + repository.save 与 mongoTemplate 之间的区别.insert 太无关紧要了?

【问题讨论】:

    标签: java spring mongodb spring-data-mongodb


    【解决方案1】:

    您可以使用 XXXRepositoryCustom 自定义您自己的存储库并为其编写实现。

    这是一个例子:

    public interface AccountRepository extends MongoRepository<Account, String>, AccountRepositoryCustom{
    
        @Query("{ 'email' : ?0 }")
        Account findByEmail(String email);
    
    }
    

    请注意,上面的接口扩展了您自己的 AccountRepositoryCustom 接口。

    然后定义你自己的 AccountRepositoryCustom:

    public interface AccountRepositoryCustom {
    
        public boolean updateAccountToken(String id, String token);
    
    }
    

    接下来,为它编写一个实现:

    public class AccountRepositoryCustomImpl implements AccountRepositoryCustom {
    
        @Autowired
        private MongoTemplate mongoTemplate;
    
        @Override
        public boolean updateAccountToken(String id, String token) {    
                // your code 
        }
    }
    

    【讨论】:

    • 是的,我以前做过。但是当 Spring Data 的存储库的主要目的是减少样板代码 IMO 时,为了获得更新和创建方法而编写大量样板代码。
    【解决方案2】:

    Spring 数据遵循repository patternRepository 是对 DAO 层的抽象,用于通用存储和检索域实体。在存储库层的底部有 DAO 层部分,其中使用了MongoTemplate

    所以Repository 有逻辑保存方法。从域的角度来看,您根本不应该关心域实体是如何持久化的。您只需调用 save 方法,MongoTemplate 的使用取决于MongoRepository 的实现。

    【讨论】:

      【解决方案3】:

      韩王的回答是正确的,但是Impl应该命名为AccountRepositoryImpl而不是AccountRepositoryCustomImpl

      查看上一个问题/答案:No property found for type error when try to create custom repository with Spring Data JPA

      【讨论】:

        猜你喜欢
        • 2013-06-05
        • 2017-03-22
        • 2017-10-24
        • 2014-10-30
        • 1970-01-01
        • 2021-08-27
        • 2012-03-21
        • 2014-10-11
        • 1970-01-01
        相关资源
        最近更新 更多