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

     2023-04-18     186

关键词:

【中文标题】通用 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... 查看详情