为 Hibernate 创建一个通用的 DAO 类

Posted

技术标签:

【中文标题】为 Hibernate 创建一个通用的 DAO 类【英文标题】:creating a generic DAO class for Hibernate 【发布时间】:2014-08-16 08:08:01 【问题描述】:

在我的 Web 应用程序中,有很多实体,其中大多数都需要 CRUD 操作。所以我正在考虑编写一个可以为所有实体处理 CRUD 的通用 DAO。我从 IBM 找到了一篇教程文章,但不太了解使用泛型类型“T”和“PK”的泛型实现。文章是at this link

我通过在所有方法中使用 Object 类型编写了以下 DAO,它们似乎工作得很好 - 我的所有实体都能够使用以下 CommonDao 类进行 CRUD。虽然它可以满足我的需求,但我正在寻找为 Hibernate 实现通用 DAO 类的最佳实践。

public class CommonDao

    private final static SessionFactory sessionFactory = HibernateUtil.getSessionFactory();

    public CommonDao() 

    @UnitOfWork
    public List findAll(Object className)
    
        List types = null;

        Session session = sessionFactory.openSession();
        Criteria criteria = session.createCriteria(className + ".class");
        types = (List <Object>) criteria.list();
        session.close();

        return types;
    

    @Transactional
    public void saveObject(Object obj)
    
        Session session = sessionFactory.openSession();
        Transaction tx = session.beginTransaction();
        session.saveOrUpdate(obj);

        tx.commit();
        session.close();
    

    @Transactional
    public void saveObjectWithManyEntities(Object obj, Set<Object> objects)   /* for OneToMany relationships */
    
        Session session = sessionFactory.openSession();
        Transaction tx = session.beginTransaction();
        session.saveOrUpdate(obj);

        for (Object o : objects)
        
            session.save(o);
        

        tx.commit();
        session.close();
    

【问题讨论】:

savesaveOrUpdate 的看似随意的使用对您没有任何好处。如果没有泛型,您也将求助于强制转换,这会引入运行时类型错误。我会认真考虑以通用方式重写这个类——如果可能的话,使用 JPA 标准查询。 List - 即 List 原始类型不应该在现代 Java 中出现。 这里有一个非常相似的讨论...***.com/questions/3573479/… 【参考方案1】:

最好的方法是将 Spring Data 包含到您的项目中。 JPA 存储库提供基本的 CRUD、分页、排序,并且您的大多数查询都可以根据方法命名约定自动构建。

在 Spring Data 之前,我们会求助于这样的 Generic Daos,但现在不会了。

【讨论】:

好建议。 @TonyGW - 你可能会在 Spring Data 上找到这个答案有帮助 ***.com/questions/9721383/…

以上是关于为 Hibernate 创建一个通用的 DAO 类的主要内容,如果未能解决你的问题,请参考以下文章

你如何为 Seam / JPA (hibernate) 创建一个 DAO 类?

如何仅使用 java 和 jdbc(无 ORM)为基本的 crud 操作实现通用 DAO?

正确实现一个 dao 类来管理事务

通用Hibernate-Dao

hibernate 通用 dao 重载 removeById

java web项目DAO层通用接口BaseDao与实现类BaseDaoImpl