Я использую комбинацию Spring / Hibernate для своего проекта со стандартными операциями CRUD.
Интересно, разумно ли проверять существование объекта перед его удалением или обновлением? Если да, то где лучше всего делать - сервис или уровень дао?
РЕДАКТИРОВАТЬ:
Извините, я сначала не обратил внимания, когда задал этот вопрос. Единственный мотив для проверки существования - бросить дружественное исключение клиенту службы (не специфично для DAO).
Проблема в том, что я «должен выполнить» проверку существования, потому что мой метод обслуживания ниже является транзакционным, и, кроме того, я использую вспомогательные классы HibernateTemplate и DaoSupport для манипулирования сеансом в объектах DAO.
Согласно упомянутому, Исключение Hibernate (например, в случае удаления несуществующего экземпляра) возникает во время фиксации, что вне моей досягаемости, потому что (я полагаю) фиксация выполняется PlatformTransactionManager в прокси-объекте, и у меня нет возможности обработать это исключение в моем методе обслуживания и повторно выдать клиенту дружественное исключение.
Но даже если я сохраню свою стратегию проверки существования перед удалением, плохой момент в том, что у меня проблемы с NonUniqueObjectException в случае, если этот экземпляр существует, потому что я повторно присоединяю (во время удаления) уже загруженный экземпляр (в режиме чтения- своевременная проверка наличия).
Например:
//Existence checking in this example is not so important
public void delete(Employee emp){
Employee tempEmp=employeeDao.read(emp.getId());
if(tempEmp==null)
throw new SomeAppSpecificException();
}
//Existence checking in this example is maybe 'more logical'
public void save(Assignment a){
Task t=taskDao.read(a.getTask().getId());
if(t==null)
throw new FriendlyForeignKeyConstraintException();
Employee e=employeeDao.read(a.getEmployee().getId());
if(e==null)
throw new EmployeeNotFoundExc();
//...some more integrity checking and similar...
assignmentDao.save(a);
}
Дело в том, что я просто хочу генерировать дружественное исключение с соответствующим сообщением в случае упомянутых ситуаций (нарушения целостности и т.п.).