Java 为Hibernate创建通用DAO类
在我的web应用程序中,有相当多的实体,其中大多数都需要CRUD操作。所以我正在考虑编写一个通用DAO,它可以处理所有实体的CRUD。我找到了一篇来自IBM的教程文章,但不太了解使用泛型类型“t”和“PK”的泛型实现。文章是 我通过在所有方法中使用对象类型编写了下面的DAO,它们似乎工作得很好——我的所有实体都能够使用下面的CommonDao类执行CRUD。尽管它可以满足我的需要,但我正在寻找为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 {
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
vssaveOrUpdate
对您没有任何好处。如果没有泛型,您也会求助于强制转换,这会引入运行时类型错误。我会认真考虑以一般的方式重写这个类,如果可能的话,使用JPA标准查询。代码>列表-也就是说,列表
rawtype在现代Java中不应该出现。这里有一个非常类似的讨论……很好的建议@TonyGW-您可能会在Spring数据中发现这个答案很有帮助