Let's say you have a collection of Car
objects (database rows), and each Car
has a collection of Wheel
objects (also rows). In other words, Car
→ Wheel
is a 1-to-many relationship.
Now, let's say you need to iterate through all the cars, and for each one, print out a list of the wheels. The naive O/R implementation would do the following:
SELECT * FROM Cars;
And then for each Car
:
SELECT * FROM Wheel WHERE CarId = ?
In other words, you have one select for the Cars, and then N additional selects, where N is the total number of cars.
Alternatively, one could get all wheels and perform the lookups in memory:
SELECT * FROM Wheel
This reduces the number of round-trips to the database from N+1 to 2.
Most ORM tools give you several ways to prevent N+1 selects.
Reference: Java Persistence with Hibernate, chapter 13.
Best Answer
Marco Cantu is a big believer in InstantObjects:
http://www.instantobjects.org/
Others include DObject:
http://www.macrobject.com/en/dobject/
and tiOPF
http://tiopf.sourceforge.net/Doc/overview/index.shtml
You also might be interested in the G Framework:
http://code.google.com/p/g-framework/