jeje, si mejor seguimos por aquí el debate que con la limitación de 100 caracteres del blog no hay quien escriba :P
Como dices un ejemplo que implicará persistencia estaría bien, en el código que he puesto sólo muestro el uso de los objetos pero no su construcción, o más bien, reconstrucción, desde la persistencia, a ver si lo puedo esbozar rápido:
public void RepositorioCompras {
Connection conexionBD;
RepositorioProductos repositorioProductos;
FactoriaCompras factoriaCompras;
public RepositorioCompras(Connection conexionBD, RepositorioProductos repositorioProductos, FactoriaCompras factoriaCompras) {
this.conexionBD = conexionBD;
this.repositorioProductos = repositorioProductos;
this.factoriaCompras = factoriaCompras;
}
Set<Compra> find(CriterioBusqueda criterio) {
Set<Compra> comprasQueSeAjustanAlCriterio = new HashSet();
Query query = connection.createQuery(criterio.toSqlQueryString());
ResultSet result = connection.executeQuery();
while(result.next()) {
long idCompra = result.getInt("idCompra");
Set<Productos> productos = repositorioProductos.productosDeLaCompraConId(idCompra);
comprasQueSeAjustanAlCriterio.add(factoriaDeCompras.crearCompra(idCompra,productos));
}
return comprasQueSeAjustanAlCriterio;
}
}
Algo así, la idea es que el repositorio de compras utiliza la factoría de compras para crear las compras, como para crear las compras necesitas los productos pues usas el repositorio de productos para obtenerlas que será parecido a este y internamente utilizara la factoría de productos. Este tipo de diseño para la persistencia es el que más me encaja con las ideas de DDD y me cuesta bastante encajar esas ideas con un ORM. (por supuesto me he saltado todo el control de excepciones, tampoco cierro nada, es un boceto :P).
Otra cosa, en este ejemplo considero que hay un agregado cuya raíz es compra y productos esta dentro, esto quizá no sería muy correcto porque producto tiene más bien pinta de entidad, así que en lugar de esto debería construir la compra pasandole el repositorio de productos, vamos es como hacer lazy loading o eager loading con un orm pero manualmente, quizá algo más costoso pero con más control de lo que estas haciendo. También se podría tener una opción en el repositorio de compra para leerlas en modo eager/lazy...
Otra cosa que me gusta de este enfoque es que los objetos siempre los construyo a través de las factorías, es decir, yo controlo el ciclo de vida y no el ORM, de esta manera no hay ningún problema para poner los colaboradores que haga falta en el objeto sin los malabarismos que hay que hacer con AOP usando spring/hibernate.
Con un api de acceso a datos un poco más "apañao" que JDBC a pelo (que es puro dolor) no veo la necesidad de un ORM tan complejo y que haga tantas cosas. Aunque también se podría usar, simplemente mapeando clases que estén en la capa de infraestructura usandolas como estructuras de datos y meramente como utilidad para facilitar la lectura de la base de datos. Quizás ese sea el problema que una librería que sólo debería ser una utilidad para facilitar una parte de mi aplicación se convierta en una pieza central de la misma y condicione tanto un diseño.