项目中,发现一个问题。我用的是 org.springframework.data.mongodb.core.MongoTemplate;用于存储数据。新建了一个Repository。创建的方法为insert(T t).代码如下
public class DashboardRepository<T> {
protected MongoTemplate mongoTemplate;
public DashboardRepository(MongoTemplate mongoTemplate) {
this.mongoTemplate = mongoTemplate;
}
public String getCollectionName() {
return "dashboard";
}
public T insert(T objectToSave) {
return mongoTemplate.insert(objectToSave, getCollectionName());
}
public boolean isDocumentExist(DashboardForm form) {
Query query = new Query();
query.addCriteria(Criteria
.where(Constants.FIELD_NAME)
.is(form.getName()));
return this.mongoTemplate.exists(query, this.getCollectionName());
}
}
调用repositiry的地方如下
public Long create(DashboardForm form) {
// 校验名称是否存在
if (dashboardRepository.isDocumentExist(form)) {
throw DashboardBusinessException.DASHBOARD_FILE_NAME_EXIST;
}
。。。
if (userName != null && !userName.equals("")) {
DashboardDB dashboardDB = new DashboardDB();
dashboardDB.setName(form.getName());
dashboardDB.setComment(form.getComment());
dashboardDB.setComponent(form.getComponent());
dashboardDB.setCreatedDate(Long.toString(System.currentTimeMillis()));
dashboardDB.setUserName(userName);
dashboardDB.setCreatedUserId(Long.toString(currentUserId));
//这里调用的持久化层
dashboardRepository.insert(dashboardDB);
} else {
throw DashboardBusinessException.DASHBOARD_USER_NAME_ERROR;
}
return null;
}
奇怪的问题:当程序刚走到create的方法的时候,mongo数据库里会有很大概率存入DashboardForm form,(参数中 对象)。况且,我程序里都没有存DashboardForm 对象的代码。
当把方法改为create或者add,或者其他名称,就不会有这个问题。去掉泛型T,也不会有这个问题。
这是为什么?
zale 已回答的问题
这是泛型本身的问题:
<span class="kwd">public</span> <span class="kwd">class</span> <span class="typ">DashboardRepository</span><span class="pun"><</span><span class="pln">T</span><span class="pun">></span> <span class="pun">{</span>
...
<span class="kwd">public</span><span class="pln"> T insert</span><span class="pun">(</span><span class="pln">T objectToSave</span><span class="pun">)</span> <span class="pun">{</span>
<span class="kwd">return</span><span class="pln"> mongoTemplate</span><span class="pun">.</span><span class="pln">insert</span><span class="pun">(</span><span class="pln">objectToSave</span><span class="pun">,</span><span class="pln"> getCollectionName</span><span class="pun">());</span>
<span class="pun">}</span>
<span class="pun">}</span>
DashboardRepository 对象的声明决定了泛型类型,另外你需要仔细检查下 DashboardForm 和 DashboardDB 是否存在继承关系。
使用 Spring Data Mongo 的话,为什么不直接采用 MongoRepository 的模板?
zale 已回答的问题
MongoDB中文社区