在我的Web應用程序中,有相當多的實體,並且大多數實體都需要CRUD操作。所以我正在考慮編寫一個可以處理所有實體的CRUD的通用DAO。我找到了來自IBM的教程文章,但不太瞭解使用泛型類型'T'和'PK'的泛型實現。這篇文章是at this link爲Hibernate創建一個通用的DAO類
我在所有的方法中使用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' - 即現代Java中從未見過的'List'原始類型。 –
這裏有一個非常類似的討論... http://stackoverflow.com/questions/3573479/how-to-create-a-generic-dao-class-using-hibernate-context-sessions?rq = 1 – Nilesh