Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/342.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么Spring数据是';MongoRepository有多有限?_Java_Spring_Mongodb_Spring Data Mongodb - Fatal编程技术网

Java 为什么Spring数据是';MongoRepository有多有限?

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数据

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