泛型DAO hibernate 4 + spring 4和异常处理



我最近在做一个spring mvc项目,我是hibernate和spring的新手。

的问题是,我想让自己避免一遍又一遍地复制代码,至少让自己避免一些繁琐的操作。因此,一个关于如何创建通用接口然后实现的示例将非常有帮助。

我首先搜索了互联网,我发现了一些关于使用SessionFactory的建议(多亏了春天,我已经有了bean),以及关于使用事务管理器的建议(不要真正得到如何,尽管,我想添加一些@Transactional注释)

还有,一个非常重要的事情,我想知道我应该处理哪些异常?

通常通过创建泛型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,请参考这个

最新更新