我对上述两种模式的看法与我在企业应用程序中看到的完全不同。
对于我对它们的理解,您使用DAO进行基本的CRUD操作(例如create(DomainEntity de)
,retrieve(ID id)
,update(DomainEntity de)
,delete(DomainEntity de)
和/或delete(ID id)
)。
DAO类根本没有对存储库的引用。
另一方面,存储库管理其他操作,如findAll()
,count()
,findBySomeCriteria(Criteria criteria)
,...即,它处理聚合根。
This网站包含了使用这两种模式的一个很好的例子。
然而,在许多使用SpringData的项目中,我看到了不同的东西。例如,对于每个实体,您都有:
EntityRepository
或其子接口之一的通用接口public interface Repository<T,ID extends Serializable>
。它包含带有一些常规名称的方法签名;基于这些名称,SpringData会自动在数据库上执行正确的查询。interface EntityDao
(与上面相同的操作)实现EntityDao
的类。这是最有争议的一点,因为这个类包含对存储库类的引用。像
@Service
public class EntityDaoImpl extends GenericDaoImpl<Entity> implements EntityDao {
@Autowired
private EntityRepository repository;
public void delete(ID id) {
repository.delete(ID id)
}
// other CRUD operations using repository
}
通过这种方式,DAO和存储库之间存在高度耦合。
那么,这是SpringData中存储库的正常用法吗? SpringData是否以与其理论方式不同的方式实现了Repository模式?