项目中,发现一个问题。我用的是 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 已回答的问题