On Fri, Aug 14, 2009 at 12:56 PM, Michael Dick (via Nabble) <
ml-user+17961-1519918...@n2.nabble.com<ml-user%2b17961-1519918...@n2.nabble.com>
> wrote:

> I haven't tested any of this out, but I'd guess that OpenJPA (and
> apparently
> other providers) have loaded your @ManyToOne relationship before you call
> the accessor method.


You know, that's an excellent point.  I wonder.

If the field was loaded by the provider there may be no reason to think that
>
> it's dirty and we need to fetch it from the database (em.refresh will force
>
> a reload).


Here's the thing, though (continuing my earlier example running through this
thread; see earlier messages for details).  If I merge e2, with its "x"
field set, but not its e1 field, which, yes, is lazy, but is also insertable
= false and updatable = false, then there is no circumstance that I can
think of where the e1 state SHOULDN'T be reloaded.

Do you see what I mean?  If I can't insert or update my e1 field, then why
wouldn't the provider be required, upon a merge, to load the e1 instance
from disk at merge time?


> It's possible that we could detect this case. Basically you have two fields
>
>  (read-only and read-write) in an entity mapped to the same column. Once
> the
> RW field has been updated we could reset the isLoaded attribute on the
> other
> one - that should trigger a reload from the database when you call the
> accessor method.


Yeah, that's exactly what I'm looking for.  I'm not looking for it as a
special case, but as (I think) the "right" way to interpret the spec.  I'm
totally happy to be corrected on this--and the fact that all the providers
seem to NOT do this obviously makes me queasy.  Surely, I thought, I must be
missing something, but I can't find whatever it is that I'm missing.  :-)
That is, this seems like it should be the required behavior.


> Are you doing this in many places throughout your app, or is this a
> one-off?


Well, I'm doing it lots of places.  I don't have to, but it seemed to me
that forcing the relationship navigation machinery to load objects was more
elegant than "brute forcing" the loads by using refresh() or find().  That
is, I can surely take in what amounts to a giant object graph (E2 and E1 are
only parts of this giant hairball I have to work with) and break it apart
and perform EntityManager operations on all the component parts, but I'd
like to be able to force the JPA relationship navigation machinery to do as
much of that for me as possible.

The larger pattern here is that I'm mapping a legacy database that uses lots
of multiple primary keys that are strings (lots of "codes").  So a given
object might be related to another object in the database by three VARCHAR
fields.

Additionally, it is impractical for someone to build up an object graph of
the size that actually needs to be persisted.  It's just too big.  So rather
than forcing someone to create a graph with, in this case, an E2 and an E1
that they previously loaded, I want them to simply hand me an E2 with only
its "foreign keys" set--i.e. its "x" field in my example.  Everything
else--the relationship, the instantiation of the related entity--is
derivable from that.  I thought I had hit on a good pattern here, but it
kind of broke down when my reading of the spec. did.  :-)

Best,
Laird

-- 
View this message in context: 
http://n2.nabble.com/insertable-updatable-%3D-false-question-tp3439111p3446350.html
Sent from the OpenJPA Users mailing list archive at Nabble.com.

Reply via email to