【发布时间】:2011-08-20 13:27:10
【问题描述】:
我正在为我的项目使用 Spring/Hibernate 组合,并使用标准 CRUD 操作。
我想知道,在删除或更新对象之前验证对象是否存在是否合理?如果是,最适合做的地方是哪里——服务层还是 dao 层?
编辑:
对不起,我一开始问这个问题的时候没有说清楚。存在检查的唯一动机是向服务客户端抛出友好的异常(没有特定于 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);
}
关键是我只想在提到的情况(完整性违规和类似情况)的情况下抛出带有适当消息的友好异常。
【问题讨论】:
标签: spring hibernate validation dao