通用 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 和异常处理的主要内容,如果未能解决你的问题,请参考以下文章
SSH集成(Struts+Spring+Hibernate)
hibernate 通用 dao 重载 removeById