Re: ORM or JDBC?
Alessio Stalla wrote:
Existing Java ORMs (those known to me, at least) fail at mapping complex enough object graphs. Relations are not (only) Collections, as ORMs would like us to believe. Collections cannot be a) filtered and b) joined without for() loops in Java.
a) parent.getAdultChildren() can only be implemented as removeMinors(parent.getAllChildren()).
b) grandParent.getGrandChildren() can only be implemented as for(Person p : parent.getAllChildren()) { collect(p.getAllChildren(); }.
That's probably fine (even if too verbose and not easily parallelizable) for objects in memory, but it's completely stupid for objects fetched from a database. Dropping to JQL, criteria, or SQL is not a solution, because it means stepping outside the OO world to return to a relational view of the world.
I don't know the .NET world well, but I've been told LINQ can solve both these problems because it represents relations as Queryables (Iterables on steroids) that support .where and .join methods (or equivalents).
Now this is not a reason not to use ORMs in Java at all, but certainly one must be well aware that seamlessly mapping a rich domain model to an RDBMS is presently impossible.
These are good points. The use case for or against ORMs isn't about
portability or performance but to simplify a large category of mappings.
Real-world ORM-based applications use custom queries and other tricks to get
the mappings they need. The question is whether these mappings are harder to
do via the framework, or through more raw library calls. This must balance
against the overall use of the ORM; what might seem easier with JDBC alone
might better be done with JPA where it's already in play.
The fact is you cannot escape mapping the data model to your domain model.
You, the practitioner, cannot escape it. You can use one tool or another to
facilitate it, and JPA is one useful sonuvagun for that, but you, the
practitioner, have to design the mappings regardless.
--
Lew
Remember, only you can prevent wildfires.
http://www.smokeybear.com/