关键词:
【中文标题】通用 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、Spring、Hibernate
】通用DAO、Spring、Hibernate【英文标题】:GenericDAO,Spring,Hibernate【发布时间】:2018-01-1011:32:45【问题描述】:我想了解如何在我的数据库上实现添加、编辑、删除和搜索等通用方法,我已经建立了连接(休眠)并且工作正常我有这... 查看详情
Hibernate 通用 DAO 搜索
】Hibernate通用DAO搜索【英文标题】:HibernategenericDAOsearch【发布时间】:2012-03-1504:29:14【问题描述】:我正在使用hibernategenericdaoproject。我需要搜索“date1”字段早于“date2”的所有记录,例如:search.addFilterLessThan(\'date1\',\'date2\');... 查看详情
hibernate 通用 dao 重载 removeById
】hibernate通用dao重载removeById【英文标题】:hibernategenericdaooverloadingremoveById【发布时间】:2016-07-2300:56:50【问题描述】:我在我的java项目中实现休眠ORM。我从github下载了源代码我已经编译了示例中包含的hibernate-maven-web。现在让... 查看详情
为 Hibernate 创建一个通用的 DAO 类
】为Hibernate创建一个通用的DAO类【英文标题】:creatingagenericDAOclassforHibernate【发布时间】:2014-08-1608:08:01【问题描述】:在我的Web应用程序中,有很多实体,其中大多数都需要CRUD操作。所以我正在考虑编写一个可以为所有实体... 查看详情
在通用 DAO 中使用 Hibernate 调用存储过程的最佳方法是啥?
】在通用DAO中使用Hibernate调用存储过程的最佳方法是啥?【英文标题】:What\'sthebestwaytocallingaStoredProcedureusingHibernateinaGenericDAO?在通用DAO中使用Hibernate调用存储过程的最佳方法是什么?【发布时间】:2012-10-2516:52:00【问题描述】... 查看详情
通用hibernate-dao
在做管理系统时。通常基于Facade模式的系统持久化层要写许多Dao。这些dao里面的方法又是重复的,那么有没有什么好的方法来统一利用一个公共的Dao。 答案是可以的。这里我们接触到JDK5.0里面的一个新特性:泛型。 关于... 查看详情
使用通用 DAO 时出现 NoSuchMethodError
】使用通用DAO时出现NoSuchMethodError【英文标题】:NoSuchMethodErrorwhileusingGenericDAO【发布时间】:2014-05-2823:04:11【问题描述】:我正在尝试在项目中使用GenericDAO:publicclassGenericDao<T>ApplicationContextctx=newAnnotationConfigApplicationContext(Sp... 查看详情
ssh集成(struts+spring+hibernate)
环境:struts2.3.Xspring4.0.0hibernate4.2思路:从下开始往上集成;层与层之间没有关系;在集成的时候,只关注当前集成的那个层的内容;1,创建一个空的web项目;重新定位class文件编译路径2,设置项目的编码;3,完成domain;4,完成映射文件;5,写DAO接... 查看详情
Hibernate GenericDAO 用于父/子关系和 DAO/DTO 模式
...】:2011-02-0502:15:12【问题描述】:我正在寻找Hibernate中的通用DAO实现,其中包括父/子关系管理(添加、删除、获取子级、设置父级等)。实际上,网络上最常用的通用DAO是我在jboss. 查看详情
使用 Resteasy / Hibernate / Spring 简化 DAO 层
...描述】:我正在为我的dao层寻找更简洁的代码:我有一个通用的dao接口:publicinterfaceGenericDAO<T>Tsave(Tentity);Tmerge(Tentity);voidd 查看详情
Generic Hibernate DAO
...层写一个泛型方法,让它可以取任何实体。关于如何编写通用dao方法的任何建议?@Entity@ 查看详情
如何测试休眠通用 dao 模式
】如何测试休眠通用dao模式【英文标题】:Howtotestthehibernategenericdaopattern【发布时间】:2012-10-0515:10:33【问题描述】:我正在使用GoogleGuice和Hibernate开始一个项目,在配置数据库访问层的方式上,我在此过程中遇到了几个疑问。... 查看详情
hibernate dao 设计问题
...:23【问题描述】:我希望在我的休眠应用程序中创建一个通用DAO来处理CRUD。我的实体的大多数关联都是LAZYfetching。但是我发现为了让休眠尽可能高效地使用SELECT,我必须在我的DAO上创建多个方法。这就是我的意思:实体A有两个... 查看详情
Spring + Hibernate DAO 作为泛型类
...成时,我想到了一个想法。据我注意到(并理解)有一种通用的方法来构建对象结构,包括配置文件、实体、dao接口 查看详情
Java + Spring + hibernate:未来即将改变的 Dao 实现
...ibernate4开发Web服务器。在我的服务器中,我有以下接口:通用道UserDao扩展了GenericDaoProdu 查看详情
级联保存不适用于 Hibernate 4 和 @OneToMany
...。我正在测试一个基础dao类,它具有用于保存、查询等的通用方法。(不是作业)。我正在使用带有hibernate.hbm2ddl. 查看详情
在通用 DAO 中获取当前对象 ID。休眠
】在通用DAO中获取当前对象ID。休眠【英文标题】:GetcurrentobjectIDinGenericDAO.Hibernate【发布时间】:2013-11-1018:14:36【问题描述】:我想在HibernateGenericDao实现中按ID删除所有对象。现在我创建了这样的方法:@OverridepublicvoiddeleteByIds(Co... 查看详情
基于spring4+hibernate4的通用数据访问层+业务逻辑层(dao层+service层)设计与实现!(代码片段)
基于泛型的依赖注入。当我们的项目中有很多的Model时,相应的Dao(DaoImpl),Service(ServiceImpl)也会增多。而我们对这些Model的操作很多都是类似的,下面是我举出的一些(见名知意,其它自行脑补):1.save2... 查看详情