一般来说,您可以创建一个通用的DAO接口(也可以称为CRUD存储库),并使其通用化。示例(请注意,这不是很冗长,仅供参考):
public interface GenericDAO<T, ID extends Serializable> {
T save(T entity);
void delete(T entity);
}
示例实现:
public class GenericHibernateDAO<T, ID extends Serializable>
implements GenericDAO<T, ID> {
private Class<T> persistentClass;
public GenericHibernateDAO() {
this.persistentClass = (Class<T>) ((ParameterizedType) getClass()
.getGenericSuperclass()).getActualTypeArguments()[0];
}
private SessionFactory sessionFactory;
public void setSessionFactory(SessionFactory sessionFactory) {
this.sessionFactory = sessionFactory;
}
public Session getSession()
{
return sessionFactory.getCurrentSession();
}
@Override
public T save(T entity)
{
getSession().save(entity);
return entity;
}
@Override
public void delete(T entity) {
getSession().delete(entity);
}
}
此外,您还可以参考其他类似的SO问题。
对于异常处理,您可以在单个控制器级别处理业务异常或任何异常,也可以使用@ControllerAdvice
从单个点处理。
例如:
@ControllerAdvice
public class GlobalDefaultExceptionHandler {
@ExceptionHandler(Exception.class)
public String exception(Exception e) {
return "error";
}
}
这里是一篇好的博客,涉及使用@ExceptionHandler
在单个控制器级别上处理异常以及使用@ControllerAdvice
和@ExceptionHandler
在全局级别上处理异常。
----------------------------------更新------------------------------------
Hibernate会抛出一个名为HibernateException
的运行时异常。
将@Transactional
视为数据库中的BEGIN TRANSACTION COMMIT ROLLBACK
模型,即如果您在事务内执行任何操作并且在此期间发生任何错误,则应回滚整个事务。因此,通常我们将此类代码/注释(@Transactional
)放在服务层中,在其中可能组合多个dao方法并将它们组合在一起成为工作单元。
使用它的语法如下:
@Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
这意味着,如果发生任何异常(请注意,我已经明确提到了
Exception.class
,您可以增加范围并使其为
Throwable.class
),Spring会为您回滚更新/插入/删除的任何数据。如果您想了解
Propagation
,请参考
this。