Java 为什么Spring数据是';MongoRepository有多有限?
所以我注意到Spring数据的MongoTemplate有很多不同类型的“保存对象”操作,比如save、upsert、insert和updateFirst 另一方面,Spring数据的MongoRepository接口有一个持久化方法:“保存”。现在,很明显,如果我想要创建/更新/升级功能,我可以很容易地实现它们。只需在调用“save”之前执行get,并检查实体是否存在。但MongoTemplate有如此多样的选项似乎很奇怪(我甚至不知道save和upsert之间有什么区别),但Spring数据的repo非常有限 如果要使用创建/更新语义,您是否认为使用Spring Data MongoRepositories而不自定义其方法是浪费/懒惰的,或者get+null check+repository.save与mongoTemplate.insert之间的区别是无关紧要的Java 为什么Spring数据是';MongoRepository有多有限?,java,spring,mongodb,spring-data-mongodb,Java,Spring,Mongodb,Spring Data Mongodb,所以我注意到Spring数据的MongoTemplate有很多不同类型的“保存对象”操作,比如save、upsert、insert和updateFirst 另一方面,Spring数据的MongoRepository接口有一个持久化方法:“保存”。现在,很明显,如果我想要创建/更新/升级功能,我可以很容易地实现它们。只需在调用“save”之前执行get,并检查实体是否存在。但MongoTemplate有如此多样的选项似乎很奇怪(我甚至不知道save和upsert之间有什么区别),但Spring数据
Repository
是DAO层上的抽象,用于存储和检索域实体。在存储库层的底部有DAO层部分,其中使用了MongoTemplate
因此,
存储库
具有逻辑保存方法。从域的角度来看,您根本不应该关心域实体是如何持久化的。您只需调用save方法,MongoTemplate的使用取决于MongoRepository
实现。您可以使用XXXRepositoryCustom定制自己的存储库,并为其编写实现
以下是一个例子:
public interface AccountRepository extends MongoRepository<Account, String>, AccountRepositoryCustom{
@Query("{ 'email' : ?0 }")
Account findByEmail(String email);
}
接下来,为它编写一个实现:
public class AccountRepositoryCustomImpl implements AccountRepositoryCustom {
@Autowired
private MongoTemplate mongoTemplate;
@Override
public boolean updateAccountToken(String id, String token) {
// your code
}
}
Han Wang的回答是正确的,但Impl应命名为AccountRepositoryImpl,而不是AccountRepositoryCustomImpl
参见前面的问题/答案:是的,我以前做过。但是,当Spring数据存储库的主要目的是减少样板代码时,为了获得更新和创建方法,需要编写大量样板代码。
public class AccountRepositoryCustomImpl implements AccountRepositoryCustom {
@Autowired
private MongoTemplate mongoTemplate;
@Override
public boolean updateAccountToken(String id, String token) {
// your code
}
}