That's a good point - we are trying to bridge the gap between OO and
RDB worlds in a best possible way. And I wish we could do a reasonable
ordering implementation (and without a join table). Otherwise the
java.util.List "contract" is indeed broken.
Andrus
On Sep 26, 2008, at 10:39 PM, Robert Zeigler wrote:
I disagree. By the "intrinsic attribute" argument, we wouldn't be
trying to support inheritance and other useful features.
The point of ORM is to bridge the gap that exists between Object
Models and Relational Models. The fact is that, in java, at least,
java.util.List is ordering-aware: you expect items that go into the
list to come back out in the same order. So supporting the notion
of an ordered collection of items, particularly when the
relationship is mapped as a List,
is probably "the right thing" to do.
In fact, ordering /is/ an intrinsic database /operation/ on a
relationship, although not an intrinsic /attribute/. But it happens
often enough that you /do/ care about the ordering of the
relationship that it would be awfully nice to /not/ have to override
the getter/setter to provide sorting. This is, of course, how I've
done things in the past... and wished cayenne had built-in support
for ordered collections. Having the sorting occur in the getter is
inefficient; unless you take great pains to ensure that you don't re-
sort unless absolutely necessary, then every fetch of your list is
an o(n) operation, instead of just the first operation (which will
load the values, or at least the keys, from the db) being an O(n)
operation. If we shifted the burden of managing ordered
relationships to cayenne, then cayenne can handle the complexity of
determining when a collection has been modified/needs to be
resorted, vs. when it doesn't, and we can minimize the effect of
having ordered collections.
Finally, Hibernate and other ORM tools support this feature; I'm not
saying we should implement every feature of other ORMS; cayenne has
its set of strengths that appeal to the people who use it, and some
"features" of other ORMS are just a pain. But I think this is one
case where supporting a feature supported by all of the major ORM
players would make Cayenne more competitive.
So, from the "theoretical" perspective (what does an ORM do), from a
pragrmatic perspective (nice to offload and reuse the burden of
efficient sorted relationship management), and the "competition"
perspective, we really ought to support sorted lists.
Robert
On Sep 26, 2008, at 9/261:47 PM , Scott Anderson wrote:
Cayenne is there to abstract the interface to the tools that the
database provides, not to obfuscate the tools. Custom ordering is
not an
intrinsic attribute of a relationship in the database; it should
not be
an intrinsic attribute of a relationship in Java.
If you need to sort the results or a JOIN, override the getter. If
you
need to maintain custom ordering, model a linked list in your schema.
This just isn't Cayenne's responsibility.