Les objets d'accès aux données (DAO) sont un modèle de conception commun, et sont recommandés par Sun. Mais les premiers exemples de DAO Java interagissaient directement avec les bases de données relationnelles - ils faisaient, en fait, du mapping objet-relationnel (ORM). Aujourd'hui, je vois des DAO au-dessus de cadres ORM matures comme JDO et Hibernate, et je me demande si c'est vraiment une bonne idée.
Je suis en train de développer un service web utilisant JDO comme couche de persistance, et je me demande s'il faut ou non introduire des DAO. Je prévois un problème lorsqu'il s'agit d'une classe particulière qui contient une carte d'autres objets :
public class Book {
// Book description in various languages, indexed by ISO language codes
private Map<String,BookDescription> descriptions;
}
JDO est suffisamment intelligent pour faire correspondre cela à une contrainte de clé étrangère entre les tables "BOOKS" et "BOOKDESCRIPTIONS". Il charge de manière transparente les objets BookDescription (en utilisant le chargement paresseux, je crois), et les persiste lorsque l'objet Book est persistant.
Si je devais introduire une "couche d'accès aux données", écrire une classe comme BookDao et y encapsuler tout le code JDO, le chargement transparent des objets enfants par JDO ne contournerait-il pas la couche d'accès aux données ? Par souci de cohérence, tous les objets BookDescription ne devraient-ils pas être chargés et persistés via un objet BookDescriptionDao (ou la méthode BookDao.loadDescription) ? Pourtant, un tel remaniement compliquerait inutilement la manipulation du modèle.
Ma question est donc la suivante : qu'y a-t-il de mal à appeler JDO (ou Hibernate, ou tout autre ORM de votre choix) directement dans la couche métier ? Sa syntaxe est déjà assez concise, et il est indépendant du datastore. Quel est l'avantage, le cas échéant, de l'encapsuler dans des objets d'accès aux données ?