9

所以我注意到 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 之间的区别无关紧要?

4

3 回答 3

6

您可以使用 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 
    }
}
于 2013-09-12T20:17:58.783 回答
0

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

请参阅上一个问题/答案: 尝试使用 Spring Data JPA 创建自定义存储库时未找到类型错误的属性

于 2014-12-05T17:43:44.400 回答
0

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

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

于 2013-08-06T21:53:01.127 回答