通用DAO hibernate 4 + spring 4和异常处理

Ais*_*asa 5 spring hibernate

我最近正在做一个春天的mvc项目,我刚接触冬眠和春天.

问题是,我想要保护自己不要一遍又一遍地复制代码,至少可以将自己从crud操作中解脱出来.因此,如何制作通用接口然后实现的例子确实会有所帮助.

我首先搜索了互联网,我发现了一些关于使用的建议SessionFactory(我已经感谢Spring了),以及使用事务管理器的建议(尽管如此,我还是想添加一些)@Transactional注释)

而且,一个非常重要的问题,我想知道我应该处理哪些例外?

San*_*p B 6

通常,您可以创建一个通用的DAO接口(可以称为CRUD存储库)并使其成为通用的.示例(请注意,这不是冗长的,仅供参考):

public interface GenericDAO<T, ID extends Serializable> {
    T save(T entity);
    void delete(T entity);
    }
Run Code Online (Sandbox Code Playgroud)

示例实现:

    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);        
        }
}
Run Code Online (Sandbox Code Playgroud)

另外,您可以参考其他类似的 SO问题.

对于异常处理,您可以处理业务异常,或者在单个控制器级别或使用单个点处理任何异常@ControllerAdvice.例如:

@ControllerAdvice
public class GlobalDefaultExceptionHandler {

    @ExceptionHandler(Exception.class)
    public String exception(Exception e) {

        return "error";
    }
}
Run Code Online (Sandbox Code Playgroud)

这里是其中涉及使用个别控制器级别的异常处理一个很好的博客@ExceptionHandler,并在使用全球层面@ControllerAdvice以及@ExceptionHandler

---------------------------------- UPDATE --------------- ---------------------

Hibernate抛出一个名为的运行时异常HibernateException.@Transactional您可以将其视为BEGIN TRANSACTION COMMIT ROLLBACK数据库中的模型,即如果您在事务中执行任何操作,并且在此期间发生任何错误,则应回滚整个事务.因此,通常我们将这种代码/注释(@Transactional)放在服务层中,您可以将几个dao方法组合在一起,并将它们放在一个事务中,使它们成为一个工作单元.

使用它的语法是:

@Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
Run Code Online (Sandbox Code Playgroud)

这意味着如果发生任何异常(请注意我已明确提到Exception.class您可以增加范围并使其成为可能Throwable.class)spring会回滚为您更新/插入/删除的任何数据.如果您想了解,Propagation请参阅此.