如何使用dao,hibernate检查是否存在具有相同名称的项目

时间:2011-08-06 03:52:07

标签: java hibernate dao

在网络应用中,我让用户创建。数据库操作通过 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);
}

2 个答案:

答案 0 :(得分:1)

两者都有效。 Alex在他的回答中给出了一些其他的选择如果您担心性能,通常不需要。写它似乎正确的方式。当它被证明是需要时,稍后进行优化。与其他方式相比,此代码非常简洁易懂:

if (dao.checkForExistence(something)) {
    return duplicateSomethingResponse();
}
dao.makePersistent(something);

答案 1 :(得分:0)

您可以使用where name=?进行条件更新,如果更新的行数为0,请执行insert。如果您将name作为密钥,Hibernate将使用saveOrUpdate为您处理。无论如何,名称可能应该编入索引。