I cannot think of a use case for it. I'll defer to the description of and explanation for this design decision on pages 520 and 524 of _Java Persistence with Hibernate_:

<excerpt>
"Hibernate's transitive persistence model uses the same basic concept as persitence by reachability: Object associations are examined to determine transitive state. Furthermore, Hibernate allows you to specify a cascade style for each association mapping, which offers much more flexibility and fine-grained control for all state transitions. Hibernate reads the declared style and cascades operations to associated objects automatically.

By default, Hibernate doesn't navigate an association when searching for transient or detached objects, so saving, deleting, reattaching, merging, and so on, a Category has no effect on any child category referenced by the childCategories collection of the parent. This is the opposite of the persistence by reachability default behavior. If, for a particular association, you wish to enable transitive persistence, you must override this default in the mapping metadata.

These settings are called cascading options. They're available for every entity association mapping (one-to-one, one-to-many, many-to- many), in XML and annotation syntax.

[...]

Hibernate's association-level cascade style model is both richer and less safe than persistence by reachability. Hibernate doesn't make the same strong guarantees of referential integrity that persistence by reachability provides. Instead Hibernate partially delegates referential integrity concerns to the foreign key constraints of the underlying SQL database.

There is a good reason for this design decision: It allows Hibernate applications to use detached objects efficiently, because you can control reattachment and merging of a detached object graph at the association level. But cascading options aren't available only to avoid unnecessary reattachment or merging: They're useful whenever you need to handle more than one object at a time"
</excerpt>


With all that said, I don't immediately see any concrete examples in the book that justify the final paragraph above. I didn't read every page, either, so it may be in there somewhere.

I think to summarize, Hibernate (and thus, JPA) are counting on RI in the RDBMS. This is an assumption that JDO is not about to make, naturally.

At the same time, I think it's quite compelling to keep JDO's available features and options as close to a superset of JPA as possible. The ability to swap a JDO implementation into an application that's coded to javax.persistence is an important goal. If there is no JDO option to allow for turning off PBR, this goal becomes a little less attainable.

I hate to sacrifice the conceptual integrity of the spec just to 'keep up' with features that may not even make sense in a JDO context, so I certainly understand if this option gets vetoed.

- Chris

On Sep 19, 2007, at 4:57 PM, Craig L Russell wrote:

I think configurability of pbr is a mistake. I've never seen a case where pbr was not what customers wanted. Anyone have an example?

Craig

On Sep 19, 2007, at 4:05 PM, cbeams wrote:

Curious if we have considered the idea of introducing standardized configuration around persistence-by-reachability.

In JDO it is on by default for persist and update, and cannot be turned off In JPA it is off by default for persist and update, and can be turned on/off

JPOX has introduced this configurability as an extension; perhaps to keep abreast of JPA we should standardize it?

See http://www.jpox.org/docs/1_2/jdovsjpa.html for details on the above

- Chris Beams

Craig Russell
Architect, Sun Java Enterprise System http://java.sun.com/products/jdo
408 276-5638 mailto:[EMAIL PROTECTED]
P.S. A good JDO? O, Gasp!


Reply via email to