Java 如何使用dao、hibernate检查是否存在同名项
在web应用程序中,我让用户创建一个项。db操作是通过dao实现完成的 通用dao实现使用查询条件 项目的名称是唯一的。因此,我必须防止用户创建两个同名项目。 我应该如何在代码中做到这一点?每次用户尝试创建项目时,我应该调用itemDao.findItemByName(newname), 如果项目存在,给用户一条错误消息?或者我应该将项目创建代码放入try-catch块,catch-exception, 并告诉用户,尝试创建新项目失败 在我看来,第一种方法可以让我向用户提供更精确的错误消息,但它将涉及一个db检查调用 对于每一次创建项的尝试,第二个将是dao类中出现的一些异常,并且不太具体 如果能给我一些建议,我将不胜感激 诚恳 吉姆 通用DAOImplJava 如何使用dao、hibernate检查是否存在同名项,java,hibernate,dao,Java,Hibernate,Dao,在web应用程序中,我让用户创建一个项。db操作是通过dao实现完成的 通用dao实现使用查询条件 项目的名称是唯一的。因此,我必须防止用户创建两个同名项目。 我应该如何在代码中做到这一点?每次用户尝试创建项目时,我应该调用itemDao.findItemByName(newname), 如果项目存在,给用户一条错误消息?或者我应该将项目创建代码放入try-catch块,catch-exception, 并告诉用户,尝试创建新项目失败 在我看来,第一种方法可以让我向用户提供更精确的错误消息,但它
...
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担心性能,那么他不应该使用字符串作为键。