Java 如何使用dao、hibernate检查是否存在同名项

Java 如何使用dao、hibernate检查是否存在同名项,java,hibernate,dao,Java,Hibernate,Dao,在web应用程序中,我让用户创建一个项。db操作是通过dao实现完成的 通用dao实现使用查询条件 项目的名称是唯一的。因此,我必须防止用户创建两个同名项目。 我应该如何在代码中做到这一点?每次用户尝试创建项目时,我应该调用itemDao.findItemByName(newname), 如果项目存在,给用户一条错误消息?或者我应该将项目创建代码放入try-catch块,catch-exception, 并告诉用户,尝试创建新项目失败 在我看来,第一种方法可以让我向用户提供更精确的错误消息,但它

在web应用程序中,我让用户创建一个项。db操作是通过dao实现完成的 通用dao实现使用查询条件

项目的名称是唯一的。因此,我必须防止用户创建两个同名项目。 我应该如何在代码中做到这一点?每次用户尝试创建项目时,我应该调用itemDao.findItemByName(newname), 如果项目存在,给用户一条错误消息?或者我应该将项目创建代码放入try-catch块,catch-exception, 并告诉用户,尝试创建新项目失败

在我看来,第一种方法可以让我向用户提供更精确的错误消息,但它将涉及一个db检查调用 对于每一次创建项的尝试,第二个将是dao类中出现的一些异常,并且不太具体

如果能给我一些建议,我将不胜感激

诚恳

吉姆

通用DAOImpl

...
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);
}

您可以使用
执行条件更新,其中name=?
并且如果更新的行数为0,则执行插入。如果您将
name
设置为一个键,Hibernate将使用
saveOrUpdate
为您处理它。无论如何,名称可能应该被编入索引。

两者都是有效的。亚历克斯在他的回答中给出了一些其他的选择。如果您担心性能,通常不需要担心。用看起来合适的方式写。稍后,当证明需要时进行优化。与其他编写方式相比,此代码非常简洁易懂:

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

如果OP担心性能,那么他不应该使用字符串作为键。