![](/img/trans.png)
[英]Some doubts about how implement Hibernate DAO in Spring applications
[英]How to implement Hibernate DAO with generics
我已經找到了一些有關如何使用泛型構建Hibernate DAO的教程,但是它們都使用EntityManager
而不是SessionFactory
。 我的問題是如何使用SessionFactory
使用泛型構建DAO。 到目前為止,我有以下內容:
接口:
public interface GenericDao<T> {
public void save(T obj);
public void update(T obj);
public void delete(T obj);
public T findById(long id);
}
類:
@Repository
public class GenericDaoImpl<T> implements GenericDao<T> {
@Autowired
private SessionFactory sessionFactory;
public void save(T obj) {
Session session = sessionFactory.openSession();
Transaction tx = null;
try {
tx = session.beginTransaction();
session.save(obj);
tx.commit();
} catch (HibernateException e) {
if(tx != null)
tx.rollback();
e.printStackTrace();
} finally {
session.close();
}
}
public void update(T obj) {
Session session = sessionFactory.openSession();
Transaction tx = null;
try {
tx = session.beginTransaction();
session.update(obj);
tx.commit();
} catch (HibernateException e) {
if(tx != null)
tx.rollback();
e.printStackTrace();
} finally {
session.close();
}
}
public void delete(T obj) {
Session session = sessionFactory.openSession();
Transaction tx = null;
try {
tx = session.beginTransaction();
session.delete(obj);
tx.commit();
} catch (HibernateException e) {
if(tx != null)
tx.rollback();
e.printStackTrace();
} finally {
session.close();
}
}
public T findById(long id) {
// ??
return null;
}
我不確定如何使用泛型來處理findById
。 我相信其他方法是正確的,但是如果我錯了,請糾正我。
側面問題:使用EntityManager
是否比使用SessionFactory
更有利? 我看到了一些有關該主題的文章,但還想發表一些意見。
您需要從該方法中訪問Class<T>
。 您有兩個選擇,可以將Class<T>
傳遞給方法:
public T findById(long id, Class<T> clazz) {
// method implementation
}
或者,您可以將Class<T>
傳遞到Class<T>
的構造函數中,以在方法中使用:
@Repository
public class GenericDaoImpl<T> implements GenericDao<T> {
private Class<T> clazz;
protected GenericDaoImpl(Class<T> clazz) {
this.clazz = clazz;
}
// other methods omitted
public T findById(long id) {
// method implementation
}
}
子類會將其類傳遞給超類:
public class UserDao extends GenericDaoImpl<User> {
public UserDao() {
super(User.class);
}
}
然后,使用clazz
實例,可以使用Session#get方法以通用方法獲取實體:
T entity = session.get(clazz, id);
有關更多信息,請參見以下問題:
至於附帶的問題, EntityManager
是JPA(Java持久性API)的一部分。 使用Java API規范而不是Hibernate API開發應用程序使您的應用程序不再依賴Hibernate。 這使您可以在流行的JPA實現(例如Hibernate,OpenJPA或TopLink)之間進行切換,而無需更改代碼。
這個問題有更多關於區別的信息。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.