编程语言
首页 > 编程语言> > java-存储库设计模式-每个Dao应该有一个repo吗?

java-存储库设计模式-每个Dao应该有一个repo吗?

作者:互联网

我的应用程序中有一些DAO,可以访问数据库进行CRUD操作.可以说有新闻,天气和体育DAO.我对我需要多少个存储库感到困惑.我应该只使用一个存储库,比如说DataRepository,让我保存数据库和所有dao的数据库.并封装CRUD操作的方法吗?还是每个DAO都有自己的存储库?

我的意思是,存储库应仅返回调用层可以理解的数据对象.所以它就像对DAO的封装,但是我不确定我应该为每个DAO创建一个还是每个应用仅创建一个仓库,等等.

如果您阅读此article,我们将开始理解该模式过度设计或过度抽象.它变成了隐藏细节与最小化查询语句.

但是似乎每个DAO都应该有一个Repo,因为接口本身看起来像这样:

interface Repository<T> {
void add(T item);
void remove(Specification specification);
List<T> query(Specification specification);

}

其中T可以是数据DAO访问的类型/表.现在只需要澄清即可.你能想象我有30种不同的类型,所以我需要30种不同的Repo实现.这是荒唐的.似乎存储库模式本身就像DAO,没有什么不同.我很混乱.

解决方法:

我不确定这不是您要寻找的东西,但是在我的应用程序中,我正在使用Spring描述的DAO模式

So im confused on how many Repositories i would need.

恕我直言,每个实体至少需要一个单独的存储库,因为它们可以简化设计,但是由于您使它们通用,并且它们处于层次结构中,因此可以与子类/接口一起使用

以下是示例

定义所有常用基本方法的接口

public interface GenericDAO<T, ID extends Serializable> {


    T findById(ID id, LockModeType lock);

    void save(T entity);

    T update(T entity);

    List<T> findAll();
}

通用实现

public abstract class GenericDAOImpl<T, ID extends Serializable> implements GenericDAO<T, ID> {

    @PersistenceContext
    protected EntityManager em;

    private final Class<T> entityClass;

    public GenericDAOImpl(Class<T> entityClass) {
        this.entityClass = entityClass;
    }

    @Override
    public T findById(ID id, LockModeType lock) {
        return em.find(entityClass, id, lock);
    }

    @Override
    public void save(T entity) {
        em.persist(entity);

    }

    @Override
    public T update(T entity) {
        return em.merge(entity);
    }

    @Override
    public List<T> findAll() {
        CriteriaQuery<T> c = em.getCriteriaBuilder().createQuery(entityClass);
        c.select(c.from(entityClass));
        return em.createQuery(c).getResultList();
    }
.
.
.
}

富班

@Entity
public class Foo implements Serializable {

    private static final long serialVersionUID = 1L;
    private Long id;
    private String text;
}

Foo知识库

public interface FooRepositiry extends GenericDAO<Foo, Long> {

    Foo findTextById(Long id);

}

实施的Foo知识库

@Transactional
@Repository
public class FooRepoImpl extends GenericDAOImpl<Foo, Long> implements FooRepositiry {

    public FooRepoImpl() {
        super(Foo.class);
    }

    @Override
    public Foo findTextById(Long id) {
        CriteriaQuery<Foo> c = em.getCriteriaBuilder().createQuery(Foo.class);
        // .
        // .
        // .
        return em.createQuery(c).getSingleResult();
    }

}

酒吧班也一样

@Transactional
@Repository
public class BarRepoImpl extends GenericDAOImpl<Bar, Long> implements BarRepo {

    public BarRepoImpl() {
        super(Bar.class);
    }

    @Override
    public List<Bar> findAllBarWithText(String text) {
        CriteriaQuery<Bar> c = em.getCriteriaBuilder().createQuery(Bar.class);
        return em.createQuery(c).getResultList();
    }
}

在这里,这种通用实现需要完成两项工作:EntityManager和
实体类.子类必须提供实体类作为构造函数参数. EntityManager是通过使用PersistenceContext提供的,或者您也可以使用getter-setter方法.由于GenericDAOImpl是抽象的,因此您不能直接使用它,而是间接使用它,并且大多数常用的方法是通用的并且在层次结构中向上,这使它们成为重用的理想候选对象.

您可以从书籍Java Persistence with Hibernate 2nd Edition了解更多

标签:repository-pattern,dao,mvp,java
来源: https://codeday.me/bug/20191111/2018652.html