为 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();
【问题讨论】:
save
与 saveOrUpdate
的看似随意的使用对您没有任何好处。如果没有泛型,您也将求助于强制转换,这会引入运行时类型错误。我会认真考虑以通用方式重写这个类——如果可能的话,使用 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?