Java 为Hibernate创建通用DAO类

Java 为Hibernate创建通用DAO类,java,hibernate,jpa,spring-data,dao,Java,Hibernate,Jpa,Spring Data,Dao,在我的web应用程序中,有相当多的实体,其中大多数都需要CRUD操作。所以我正在考虑编写一个通用DAO,它可以处理所有实体的CRUD。我找到了一篇来自IBM的教程文章,但不太了解使用泛型类型“t”和“PK”的泛型实现。文章是 我通过在所有方法中使用对象类型编写了下面的DAO,它们似乎工作得很好——我的所有实体都能够使用下面的CommonDao类执行CRUD。尽管它可以满足我的需要,但我正在寻找为Hibernate实现通用DAO类的最佳实践 public class CommonDao {

在我的web应用程序中,有相当多的实体,其中大多数都需要CRUD操作。所以我正在考虑编写一个通用DAO,它可以处理所有实体的CRUD。我找到了一篇来自IBM的教程文章,但不太了解使用泛型类型“t”和“PK”的泛型实现。文章是

我通过在所有方法中使用对象类型编写了下面的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();
    }
}
公共类CommonDao
{
private final static SessionFactory SessionFactory=HibernateUtil.getSessionFactory();
公共公共DAO(){}
@工作单元
公共列表findAll(对象类名称)
{
列表类型=空;
Session Session=sessionFactory.openSession();
条件=session.createCriteria(className+“.class”);
类型=(列表)条件。列表();
session.close();
返回类型;
}
@交易的
公共void保存对象(对象obj)
{
Session Session=sessionFactory.openSession();
事务tx=会话.beginTransaction();
会话。保存或更新(obj);
tx.commit();
session.close();
}
@交易的
公共void saveobjectwithmanyenties(Object obj,Set objects)/*用于OneToMany关系*/
{
Session Session=sessionFactory.openSession();
事务tx=会话.beginTransaction();
会话。保存或更新(obj);
用于(对象o:对象)
{
保存(o);
}
tx.commit();
session.close();
}
}

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


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

似乎随机使用
save
vs
saveOrUpdate
对您没有任何好处。如果没有泛型,您也会求助于强制转换,这会引入运行时类型错误。我会认真考虑以一般的方式重写这个类,如果可能的话,使用JPA标准查询。代码>列表-也就是说,
列表
rawtype在现代Java中不应该出现。这里有一个非常类似的讨论……很好的建议@TonyGW-您可能会在Spring数据中发现这个答案很有帮助