通用DAO使用hibernate 4和spring 4,以及异常处理

5

最近我在做一个Spring MVC项目,对Hibernate和Spring还不是很熟悉。

我的问题是,我希望避免一遍又一遍地复制代码,至少要避免CRUD操作。所以,一个关于如何创建通用接口及其实现的示例会非常有帮助。

我先在网上搜索了一下,发现一些建议使用SessionFactory(感谢Spring,我已经有了这个bean),还有一些建议使用事务管理器(虽然我不太明白如何使用,但我想添加一些@Transactional注释)。

另外,一个非常重要的问题是,我想知道应该处理哪些异常?


对于异常 - Ankur Singhal
1
提示,放弃使用普通的Hibernate,改用JPA并使用Spring Data JPA,这将使您免于编写存储库。 - M. Deinum
M.Deinum,这很有趣,我的问题是,这是否意味着我不会使用Hibernate?Spring Data JPA相比Hibernate有哪些优势? - Aissasa
1个回答

6
一般来说,您可以创建一个通用的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

谢谢您清晰的回答,但是您没有回答我使用Hibernate时会抛出哪些类型的异常,以及如何使用注释@Transactional? - Aissasa
已更新答案 :) - Sandeep B

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接