hibernatedomain-driven-designejb-3.0repository-patterndata-access-layer

What is the difference between DAO and Repository patterns?


What is the difference between Data Access Objects (DAO) and Repository patterns? I am developing an application using Enterprise Java Beans (EJB3), Hibernate ORM as infrastructure, and Domain-Driven Design (DDD) and Test-Driven Development (TDD) as design techniques.


Solution

  • DAO is an abstraction of data persistence.
    Repository is an abstraction of a collection of objects.

    DAO would be considered closer to the database, often table-centric.
    Repository would be considered closer to the Domain, dealing only in Aggregate Roots.

    Repository could be implemented using DAO's, but you wouldn't do the opposite.

    Also, a Repository is generally a narrower interface. It should be simply a collection of objects, with a Get(id), Find(ISpecification), Add(Entity).

    A method like Update is appropriate on a DAO, but not a Repository - when using a Repository, changes to entities would usually be tracked by separate UnitOfWork.

    It does seem common to see implementations called a Repository that is really more of a DAO, and hence I think there is some confusion about the difference between them.