【发布时间】: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 中出现。 -
这里有一个非常相似的讨论...stackoverflow.com/questions/3573479/…
标签: java hibernate jpa spring-data dao