簡體   English   中英

如何使用泛型實現Hibernate DAO

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM