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

Posted

技术标签:

【中文标题】通用 DAO hibernate 4 + spring 4 和异常处理【英文标题】:Generic DAO hibernate 4 + spring 4 and exception handling 【发布时间】:2014-10-18 01:41:56 【问题描述】:

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

问题是,我想避免一遍又一遍地复制代码,至少让自己免于杂乱无章的操作。所以一个关于如何制作通用接口然后实现的例子真的很有帮助。

我首先搜索了互联网,发现了一些关于使用 SessionFactory 的建议(感谢 spring,我已经有了 bean),还有关于使用事务管理器的建议(虽然不知道如何使用,我想添加一些@Transactional 注释)

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

【问题讨论】:

为exceptions 提示,放弃使用 JPA 并使用 Spring Data JPA 的普通休眠模式,这将使您甚至无需编写存储库。 M.Deinum ,这很有趣,我的问题是,这是否意味着我不会使用休眠? Spring Data JPA 与 hibernate 相比有哪些优势? 【参考方案1】:

通常,您通过制作一个通用的 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);        
        

另外,您可以参考其他similar SO 问题。

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

@ControllerAdvice
public class GlobalDefaultExceptionHandler 

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

        return "error";
    

Here 是一个很好的博客,它涉及使用@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时抛出什么类型的异常,以及如何使用注解事务? 更新了答案:)

以上是关于通用 DAO hibernate 4 + spring 4 和异常处理的主要内容,如果未能解决你的问题,请参考以下文章

Hibernate 通用 DAO 搜索

SSH集成(Struts+Spring+Hibernate)

为 Hibernate 创建一个通用的 DAO 类

hibernate 通用 dao 重载 removeById

在通用 DAO 中使用 Hibernate 调用存储过程的最佳方法是啥?

通用Hibernate-Dao