为什么Spring Data的MongoRepository如此有限?

Cor*_*han 9 java spring mongodb spring-data-mongodb

所以我注意到Spring Data的MongoTemplate有很多不同类型的"保存对象"操作,比如save,upsert,insert和updateFirst.

另一方面,Spring Data的MongoRepository接口有一个持久化方法:"save".现在,显然,如果我想要创建/更新/ upsert功能,我可以很容易地实现它们.在调用"save"之前先做一个get,然后检查实体是否存在.但看起来很奇怪,MongoTemplate有如此多样的选项(我甚至无法弄清楚保存和upsert之间的区别是什么),但是Spring Data的回购是如此有限.

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

Han*_*ang 5

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

这是一个例子:

public interface AccountRepository extends MongoRepository<Account, String>, AccountRepositoryCustom{

    @Query("{ 'email' : ?0 }")
    Account findByEmail(String email);

}
Run Code Online (Sandbox Code Playgroud)

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

然后定义自己的AccountRepositoryCustom:

public interface AccountRepositoryCustom {

    public boolean updateAccountToken(String id, String token);

}
Run Code Online (Sandbox Code Playgroud)

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

public class AccountRepositoryCustomImpl implements AccountRepositoryCustom {

    @Autowired
    private MongoTemplate mongoTemplate;

    @Override
    public boolean updateAccountToken(String id, String token) {    
            // your code 
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 是的,我以前做过.但是,当Spring Data的存储库的主要目的是减少样板代码IMO时,为了获得更新和创建方法,需要编写大量的样板代码. (4认同)

mic*_*man 0

Spring Data 遵循存储库模式Repository是 DAO 层的抽象,用于通用存储和检索域实体。在存储库层的底部有MongoTemplate使用DAO层的部分。

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