在网络应用中,我让用户创建项。数据库操作通过 dao实现完成 使用hibernate 。泛型dao实现使用 Criteria 进行查询
项目的名称是唯一的。因此,我必须阻止用户创建两个具有相同名称的项目。 我应该如何在代码中执行此操作?每次用户尝试创建项目时,都应该调用 itemDao.findItemByName(newname), 如果一个项目存在,给用户一个错误信息?或者我应该将项目创建代码放在try catch块中,捕获异常, 并告诉用户,创建新项目的尝试失败了吗?
在我看来,第一种方法会让我向用户提供更准确的错误信息。但它会涉及一次数据库检查 对于每次创建项目的尝试。第二种是从dao类中沸腾起来并且不太具体。
我很欣赏这方面的一些建议......
真诚
吉姆
GenericDaoImpl
...
public T findUniqueItemByProperty(String propName,String propVal){
Class clz = getPersistentClass();
Session session = getSession();
logger.info("session="+session.hashCode());
Criteria cri = session.createCriteria(clz).add(Restrictions.eq(propName,propVal));
return (T)cri.uniqueResult();
}
public void saveOrUpdate(T obj) {
getSession().saveOrUpdate(obj);
}
...
ItemDao
...
public Item findItemByName(String name){
return findUniqueItemByProperty("name",name);
}
public void saveOrUpdateItem(Item item){
saveOrUpdate(item);
}
答案 0 :(得分:1)
两者都有效。 Alex在他的回答中给出了一些其他的选择如果您担心性能,通常不需要。写它似乎正确的方式。当它被证明是需要时,稍后进行优化。与其他方式相比,此代码非常简洁易懂:
if (dao.checkForExistence(something)) {
return duplicateSomethingResponse();
}
dao.makePersistent(something);
答案 1 :(得分:0)
您可以使用where name=?
进行条件更新,如果更新的行数为0,请执行insert。如果您将name
作为密钥,Hibernate将使用saveOrUpdate
为您处理。无论如何,名称可能应该编入索引。