Re: Batch faulting with Cayenne 3: small add-on to correct problem

From: Kevin Menard (kmenar..ervprise.com)
Date: Tue Nov 20 2007 - 07:31:38 EST

  • Next message: Jan Lendholt: "RE: Deletion of obejcts"

    Interesting. This is a situation I'd prefer never occur anyway. IMO,
    ToManyList should work like a Set with a defined iteration order. This
    wouldn't necessarily preclude duplicates because the uniqueness would be
    based on the key.

    The trade-off is the overhead of managing those semantics. Although, I've
    done it locally (subclassed CayenneDataObject) and haven't noticed a severe
    performance hit.

    I believe you'll be able to work directly with Sets in Cayenne 3.0. This
    would probably be a better approach for you, providing that insertion order
    does not matter much.

    -- 
    Kevin Menard
    Servprise International, Inc.
    Remote reboot & power control for network equipment
    www.servprise.com              +1 508.892.3823 x308
    

    On 11/20/07 3:48 AM, "Alexander Lamb (dev)" <alam..ac.com> wrote:

    > Hello, > > In my code example, there is actually a bug. > Indeed, if I do: > >>>> List<Role> roles = getObjectContext().performQuery(query); >>>> ToManyList tml = new ToManyList(this,"roles"); >>>> tml.addAll(roles); >>>> writePropertyDirectly("roles",tml); >>> > > > I will end up with twice the number of roles... Indeed, doing "addAll" > will first fire the to-many which was just created before adding the > objects... > The only way to avoid that initial fetch is to do: > > tml.setObjectList(roles) > > then continue with the writePropertyDirectly. > > Alex > > > Le 15 nov. 07 à 10:45, Alexander Lamb (dev) a écrit : > >> >> >>> The code below should work. Another way is to use multi-step >>> prefetching on a root of to-many relationship. >> >> Well, that's a good news so we shall probably implement my piece of >> code for most relationships. However, I am afraid I didn't >> understand your second sentence:-( >>> >>> >>>> Now, it would still be cool if we could have batch faulting for >>>> the odd places where we didn't set up the prefetching. >>> >>> While I used batch faulting in webobjects days and found it quite >>> useful, I could never understand how to make it work predictably >>> (i.e. fault the objects that I care about). I wouldn't object >>> though to somebody (or even myself) implementing it at the >>> framework level if whoever that is could explain me the algorithm >>> used to select which objects to fault. IIRC EOF builds internal >>> "fault chains". Wonder how much overhead this would incur in Cayenne. >> I don't think there is a particular order in which the faults are >> fired. Actually, it is not a problem since gradually in a few >> queries, all outstanding faults will be fired. My guess is that upon >> firing the first fault of a to-one registered to batch fault, you >> simply (ok, not that simple:-) look at all entities of same class in >> the DataContext and take the first X to be fired at random. X being >> the size of the batch. Of course, it some how means if there is a to- >> one which needs to be batch faulted it has to be flagged somewhere >> so you quickly know which objects to take into account. >>> >>> BTW relationship prefetching policies can be specified per JPA spec >>> (and hence will be implemented in Cayenne). However my >>> understanding is that JPA specifies a different kind of prefetch - >>> which attributes/relationships to resolve eagerly when an object is >>> fetched. >> >> I am afraid I don't know anything about JPA, but it probably means >> in the future some kind of interface in the modeler to be able to >> specify those prefetches? >> >> Thanks! >> >> Alex



    This archive was generated by hypermail 2.0.0 : Tue Nov 20 2007 - 07:32:16 EST