Spring + Hibernate DAO作为泛型类

时间:2015-04-22 11:09:30

标签: java spring hibernate

前段时间我开始学习java EE。我迅速移动到春天(mvc)+休眠。当我学习数据库并与spring + hibernate集成时,我提出了一个想法。

据我所知(并理解),有一种构建对象结构的常用方法,包括配置文件,实体,dao接口和dao实现(因为我们只谈dbs,而不是控制器和其他应用程序的层) 。我决定编写一个通用的java类并将其命名为BasicDao这是一个以实体为类型的模板。

这实际上是有效的,我认为它比接口和实现要好得多,因为你只需要一个类用于所有实体(如果你想为每个实体编写单独的实现,你可能最终会得到大量的文件)。

我还在那里编写了一些模板函数,因此该类非常灵活(没有类型传递给db的异常)。这是代码

package local.bb.dao;

import java.util.List;
import org.hibernate.SessionFactory;
import org.hibernate.criterion.Restrictions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

@Repository(value = "basicDao")
@Transactional(propagation = Propagation.REQUIRED,readOnly = true)
public class BasicDao<ENTITY> {

    private Class<ENTITY> data;
    private SessionFactory sessionFactory;

    public BasicDao() {
        this.data = null;
    }

    @Transactional
    public void addRecord(ENTITY t) {
        this.sessionFactory.getCurrentSession().save(t);
    }

    @Transactional
    public void removeRecord(ENTITY t) {
        this.sessionFactory.getCurrentSession().delete(t);
    }

    @Transactional
    public List<ENTITY> getAllRecords() {
        return (List<ENTITY>)this.sessionFactory.getCurrentSession().createCriteria(this.data).list();
    }

    @Transactional
    public <TYPE> ENTITY getRecordByParam(String param, TYPE value) {
        return (ENTITY)this.sessionFactory.getCurrentSession().createCriteria(this.data).add(Restrictions.eq(param, value)).uniqueResult();
    }

    @Transactional
    public <TYPE> List<ENTITY> getRecordsByParam(String param, TYPE value) {
        return (List<ENTITY>)this.sessionFactory.getCurrentSession().createCriteria(this.data).add(Restrictions.like(param, value)).list();
    }

    //  GETTERS / SETTERS

    public SessionFactory getSessionFactory() {
        return sessionFactory;
    }


    @Autowired
    public void setSessionFactory(SessionFactory sessionFactory) {
        this.sessionFactory = sessionFactory;
    }

    public Class<ENTITY> getData() {
        return data;
    }

    public void setData(Class<ENTITY> data) {
        this.data = data;
    }


}

最后,问题是:它实际上是一种好方法吗?因为我从未在任何地方见过这样的代码(谈论互联网和书籍上的教程)。

1 个答案:

答案 0 :(得分:2)

Spring喜欢接口,因为有几个重要的机制是基于它的,例如AOP,拦截器。因此,如果您决定不使用它们,则必须接受Spring功能的某些限制。更重要的是,为依赖于你的DAO的其他类编写Test-Mocks会更难。

如果您想保存代码,我建议您丢失实施而不是接口。使用Spring JPA,您可以使用一组注释(即@Query, @Procedure, @Modifying等)来注释DAO接口,以定义数据的访问方式。如果您在应用程序上下文中启用JPA存储库,Spring将为您提供DAO实现。

可以找到更多信息here