Die Repositories gehören zur Domäne und damit zur Geschäftslogik, für jede Entity ein Repository bzw. so wie man sie braucht
Die Repositories sind die einzigen Stellen der Anwendung, in denen DAOs genutzt werden, sie bilden die Schnittstelle zwischen Business Tier und Integration Tier.
Die Methoden die sie anbieten sind "high-level", also auf demselben Niveau wie die Domänenobjekte welche die Repositories nutzen, dadurch trennt man elegant zwischen Persistenz und Domäne.
Persönlich halte ich nicht viel davon, Domainobjekte direkt auf DAOs zugreifen zu lassen, es gibt da soz. einen Bruch in der Abstraktionsebene:
Domainobjekt -> high level, fachlich
DAO -> low level, CRUD Operationen auf eine DB, oft ein DAO pro Tabelle, hat eigentlich nix mit Geschäftslogik zu tun, sondern mit Implementierungsdetails.
Macht man die DAOs high level mischt man dort Geschäftslogik mit Persistenzlogik.
Die Alternative ist, die DAOs aus Services(SessionBeans etc.) zu nutzen, nicht sehr OO imho, spätestens wenn ein UseCase mehrere DAOs braucht merkt man wie unschön das eigentlich ist...
Mit Repositories können die Entitäten(Domänenobjekte) selbst andere Entitäten finden/speichern/löschen etc, ohne Details zu kennen, denn diese sind ja in den Repositories gekapselt.
Typische Methoden für ein Rep. wären findById(..), findByCriteria(..), store(..) bzw. save(..), delete und dann noch die zus. Businessmethoden, so wie sie gebraucht werden.
Im Prinzip sind Repositories DAOs mit high level Methoden und stellen dadurch eine zus. Abstraktion zwischen Domäne und echten DAOs dar. Diese "Schicht" ist eigentlich sehr dünn, Clientseitig werden eben wie gesagt nur high-level Methoden angeboten, intern werden DAOs genutzt um diese umzusetzen.
Repositories sind natürlich zusätzlicher Aufwand (so wie jede Abstraktion), aber wenn man sich die DAOs dank dem JPA EntityManager sparen kann, tut man gut daran sie einzusezten.
Sie haben viele Vorteile, von der angesprochen Trennung der verschiedenen Abstraktionsebenen bieten sie sehr einfach die Möglichkeit, Unittests zu schreiben, brauche ja bloss ein Mock-Repository anstatt einer echten DB Anbindung um meine Domäne zu testen
Bin durch das Buch "POJOs in Action" darauf gekommen, die eigentliche Idee ist aber älter und wird schon im Buch "Domain Driven Design" von Eric Evans besprochen.