Как проверить, существует ли элемент с таким же именем, используя Дао, Hibernate - PullRequest
0 голосов
/ 06 августа 2011

В веб-приложении я разрешаю пользователю создать Item . Манипуляции с БД выполняются с помощью dao реализации которые используют hibernate . Общая реализация dao использует Criteria для запроса

Имя элемента уникально. Поэтому я должен запретить пользователю создавать два элемента с одинаковым именем. Как мне сделать это в коде? Каждый раз, когда пользователь пытается создать элемент, я должен вызвать itemDao.findItemByName (newname) , и если элемент существует, выдает пользователю сообщение об ошибке? Или я должен поместить код создания элемента в блок try catch, исключение catch, и скажите пользователю, что попытка создать новый элемент не удалась?

Мне кажется, что первый подход позволит мне дать более точное сообщение об ошибке пользователю. Но это будет связано с одним вызовом проверки БД за каждую попытку создания элемента. Вторым будет некоторое исключение, всплывающее из класса дао и менее конкретное.

Буду признателен за совет по этому поводу.

искренне

Jim

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 ]

1 голос
/ 06 августа 2011

Любой из них действителен.Алекс дает некоторые другие альтернативы в своем ответе.Если вы беспокоитесь о производительности, вам обычно это не нужно.Запишите это так, как кажется правильным.Оптимизируйте позже, когда это окажется необходимым.Этот код очень прост и понятен по сравнению с тем, как его можно написать:

if (dao.checkForExistence(something)) {
    return duplicateSomethingResponse();
}
dao.makePersistent(something);
0 голосов
/ 06 августа 2011

Вы можете выполнить условное обновление с помощью where name=?, и если количество обновленных строк равно 0, вставьте. И если вы сделаете name ключ, Hibernate позаботится о вас с помощью saveOrUpdate. В любом случае, имя, вероятно, должно быть проиндексировано.

...