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