Re: Modification and deletion of data objects

From: Mike Kienenberger (mkienen..mail.com)
Date: Thu Jul 23 2009 - 13:28:21 EDT

  • Next message: Dave Lamy: "Simple callback question"

    Devatha,

    Cayenne is not a perfect fit for what you are asking to do. You are
    going to have to either write some supporting code to make it do what
    you want or work within the design of Cayenne. You can certainly
    subclass DataContext and add your own extensions to it.

    I don't know of anyone using Cayenne with Transfer Objects to business
    objects. I tried writing a couple of projects like that, but my
    experience was that it's not a useful way to design applications since
    my business objects were practically identical to my Cayenne objects.
     I found that making the Cayenne objects conform to a business
    interface worked much better for my projects, which avoided the
    overhead of transferring state between objects.

    While you can use the DataContext as the manager for tracking data
    objects, it wasn't designed for that purpose, so you might have to
    live with some inefficiencies, like having to search through the
    entire list of modified or new objects rather than the list for a
    specific class. Again, though, you can certainly make your own
    modifications to DataContext so that registering an object also
    indexes it by class and persistence state and then query that index if
    that's something you care about.

    On Thu, Jul 23, 2009 at 2:14 AM, sridhar
    devatha<devatha.sridha..mail.com> wrote:
    > one more thing is that method descriptions in cayenne api are not complete
    > in the general exception flow.
    > When I saw datacontext class api, i found that there is no way i can get the
    > list of new/modified objects of particular data object class.
    > I am getting a dumb idea that whenever I convert data object to business
    > object, i will invalidate that data object. As I don't exactly use the same
    > object during modification. There may be no side effect for me. Next time, I
    > use objectForQuery to fetch the object again, apply the changes and commit.
    > it is making additional select query unnecessarily as there is no way of
    > getting registered data object from data context without using object id.
    > On Thu, Jul 23, 2009 at 10:42 AM, sridhar devatha <devatha.sridha..mail.com
    >> wrote:
    >
    >> mike, transfer object design pattern might be a good example why I don't
    >> expose data objects in view layer. see
    >> http://java.sun.com/blueprints/patterns/TransferObject.html
    >> Then if i have to use separate objects (that is transfer objects) in view
    >> layer. How do you want me to do the conversion to and from business object?
    >> I have to include object id/ entity name in the transfer / view object to
    >> build business object. I don't want to do that.
    >>   On Thu, Jul 23, 2009 at 10:10 AM, sridhar devatha <
    >> devatha.sridha..mail.com> wrote:
    >>
    >>> I can not use any data context, entity resolver, entity name and object
    >>> id, as I did not keep the data object. Keeping the reference to data object
    >>> is redundant, as data context is already maintaining them. Cayenne did not
    >>> provide a way for getting the registered data object using unique keys(not
    >>> primary keys! 99% of tables will have column(s) to uniquely identify a table
    >>> row.) I recommend to provide checkboxes to indicate the unique keys in
    >>> modeler. that way, a uniqueObject (it is somewhat similar to primary key
    >>> class in EJB. But, it does not use primary keys, only uses unique keys) can
    >>> be created using the unique columns related properties by the cayenne
    >>> modeler. This   unique object can be used to retrieve the data object
    >>> registered with the data context(say lookupDataObject() or getDataObject()
    >>> in DataContext) by comparing one or more unique key related property
    >>> values.  If there is no such registered data object, these methods should
    >>> make a data base call internally and get the data object of the matched
    >>> database table row. If neither data object nor the table row exists, this
    >>> method should return null or throw some exception.
    >>> By the way, I want to use DataObjectUtils.objectForQuery() as I did not
    >>> retain neither object id nor entity name of the data object(I don't want to
    >>> retain them in business object / view object.). I think this objectForQuery
    >>> will hit the data base instead of first looking in the data context. Is not
    >>> it? It is time to provide this functionality so that it can be really easy
    >>> to do basic crud operations using cayenne. When cayenne provides the methods
    >>> to get the list of new and modified objects. How come it does not provide
    >>> the basic method of getting the registered object? It is absolutely
    >>> surprising and shocking to me!!!
    >>>
    >>> About the mike's reply, caching or creating interfaces forces me
    >>> substantially to focus on technical things rather than on developement of
    >>> project functionality. I absolutely think retrieving the existing registered
    >>> data object should be very fundamental method of cayenne. Is not it?
    >>> Moroever, I would rather say that data context should take the burden of
    >>> removing data objects and overwriting the existing data object with the new
    >>> object that is getting created, if you don't provide methods for getting the
    >>> existing registered objects in the data context.There is a great reason not
    >>> to use the data object in business layer / view layer. Even if you use data
    >>> object in business layer, what should I send to view layer.How can I convert
    >>> business object to view object and vice versa without using context, entity
    >>> resolver,entity name and object id. I am involved in several projects where
    >>> data objects are not at all exposed to view or business layer. One purpose
    >>> of using business object is to insulate business layer from the internal
    >>> changes of data objects/ data access layer . same is the case with view
    >>> object.
    >>>
    >>> If you need any further info related to above things, ask me. I will be
    >>> available during weekends only.
    >>> Moreover, I am getting doubts about the declarative transactions. Do you
    >>> provide them?If yes , tell me how?
    >>> To sum up,
    >>> Please answer about not providing methods for getting the existing
    >>> registered objects from data context?
    >>> Please answer how objectForQuery() works?That is, whether it looks in the
    >>> data context before hitting the database.
    >>> Please answer about declarative transactions using a good example.
    >>>
    >>> thanks and regards,
    >>> sridhar
    >>>   On Thu, Jul 23, 2009 at 12:48 AM, Mike Kienenberger <mkienen..mail.com
    >>> > wrote:
    >>>
    >>>> No, but here's the two templates that are most relevent.   This is
    >>>> probably against Cayenne 1.2 (2.0 with different package names).
    >>>>
    >>>> If they're helpful, great!  If not, sorry, it's as-is at the moment --
    >>>> it's really not that difficult to come up with your own.  I might have
    >>>> more up-to-date versions, but that's what's in front of me at the
    >>>> moment.
    >>>>
    >>>> On Wed, Jul 22, 2009 at 2:58 PM, Emanuele Maiarelli<evvdra..ahoo.it>
    >>>> wrote:
    >>>> > Did u made em public accessible? (sourceforge or kinda)
    >>>> >
    >>>> >
    >>>> >
    >>>> >
    >>>> > ________________________________
    >>>> > Da: Mike Kienenberger <mkienen..mail.com>
    >>>> > A: use..ayenne.apache.org
    >>>> > Inviato: Mercoledì 22 luglio 2009, 20:52:25
    >>>> > Oggetto: Re: Modification and deletion of data objects
    >>>> >
    >>>> > I wrote templates to generate interfaces as well as concrete classes
    >>>> > for entities.
    >>>> > It's been awhile since I looked at them, so I don't know if they're
    >>>> > suitable for public consumption.
    >>>> >
    >>>> > On Wed, Jul 22, 2009 at 2:36 PM, Emanuele Maiarelli<evvdra..ahoo.it>
    >>>> wrote:
    >>>> >> Hi agree with Mike, unless you have previous designed objects, i'd
    >>>> take DataObjects
    >>>> >> as business objects.
    >>>> >>
    >>>> >> If u get previous designed objects u could work on the package
    >>>> 'entities' implementing
    >>>> >> methods do adapt DataObjects to your needs. IDEs (at least NetBeans)
    >>>> got refactoring services
    >>>> >> that can help u extracting interfaces from your classes, quickly.
    >>>> >>
    >>>> >>
    >>>> >>
    >>>> >>
    >>>> >>
    >>>> >>
    >>>> >> ________________________________
    >>>> >> Da: Mike Kienenberger <mkienen..mail.com>
    >>>> >> A: use..ayenne.apache.org
    >>>> >> Inviato: Mercoledì 22 luglio 2009, 20:21:32
    >>>> >> Oggetto: Re: Modification and deletion of data objects
    >>>> >>
    >>>> >> I'm not aware of anyone else using separate objects for the business
    >>>> >> level.  I use the DataObjects as the business level objects.  Yes, if
    >>>> >> you decide to manually recreate data objects from business objects,
    >>>> >> there will be some overhead.  If I had to go that route, I'd create a
    >>>> >> central management class and have it cache what objects I already know
    >>>> >> exist in the data context the first time I reference them rather than
    >>>> >> searching through the data context lists each time.
    >>>> >>
    >>>> >> One possiblity you could consider is to generate interfaces for your
    >>>> >> DataObjects and then pass the interface rather than the DataObject
    >>>> >> concrete class.  This is what I tend to do in my projects.   That way,
    >>>> >> you can hide all of the Cayenne-specific methods from your other code
    >>>> >> if you want.   Other than some dependencies on Cayenne classes and a
    >>>> >> couple of other methods, there's not a lot of difference between a
    >>>> >> Cayenne data object and a "cayenne-free" business representation of
    >>>> >> the same data.
    >>>> >>
    >>>> >> On Wed, Jul 22, 2009 at 2:15 PM, sridhar
    >>>> >> devatha<devatha.sridha..mail.com> wrote:
    >>>> >>> andrus, it is not clear(thank for reply though), i have to try over
    >>>> weekend.
    >>>> >>> moreover, i can not use context, getEntityName in business object. I
    >>>> wrote
    >>>> >>> business object to data object conversion in data object class it
    >>>> self. so I
    >>>> >>> can use cayenne java api.  I have to do it in the data object class
    >>>> which is
    >>>> >>> sub class _data object, as it will have reference of business object.
    >>>> But,
    >>>> >>> any way I am just surprised to see that there is no modification
    >>>> example
    >>>> >>> code. Nobody uses cayenne data object from view layer to
    >>>> business/service
    >>>> >>> layer to data access layer in web or enterprise applications(because
    >>>> it is
    >>>> >>> cayenne data object with several other sensitive methods available.
    >>>> even if
    >>>> >>> the methods are not there. I don't want to couple all the layers. ).
    >>>> I don't
    >>>> >>> want to expose that sensitive object. more concrete examples will
    >>>> make it
    >>>> >>> easier for new developers like me.
    >>>> >>> I think what Mike Kienenberger(thanks mike , that is what I am also
    >>>> thinking
    >>>> >>> at least. by the way what do you say about andrus reply) is telling
    >>>> may be
    >>>> >>> correct. then i have to go thru all the new and modified registered
    >>>> objects
    >>>> >>> in the data context to see if there is any thing existing. clearly
    >>>> this kind
    >>>> >>> of searching will make it difficult for every data object updation
    >>>> and
    >>>> >>> deletion. what do you say.
    >>>> >>>
    >>>> >>> On Wed, Jul 22, 2009 at 3:45 PM, Andrus Adamchik <
    >>>> andru..bjectstyle.org>wrote:
    >>>> >>>
    >>>> >>>> In your business object you will need to know 3 things to map it to
    >>>> a
    >>>> >>>> Cayenne object: entity name, id, state (new or already persistent).
    >>>> Then you
    >>>> >>>> can do something like this (pseudo code of course):
    >>>> >>>>
    >>>> >>>> X businessObject = ...;
    >>>> >>>> DataObject cayenneObject;
    >>>> >>>> Class cayenneObjectClass = context.getEntityResolver().
    >>>> >>>>
    >>>> getClassDescriptor(businessObject.getEntityName()).getObjectClass();
    >>>> >>>> if(bObject.isNew()) {
    >>>> >>>>  cayenneObject = context.newObject(cayenneObjectClass);
    >>>> >>>> }
    >>>> >>>> else {
    >>>> >>>>  cayenneObject = DataObjectUtils.objectForPK(cayenneObjectClass,
    >>>> >>>> businessObject.getId());
    >>>> >>>> }
    >>>> >>>>
    >>>> >>>> // merge fields...
    >>>> >>>>
    >>>> >>>> Hope I answered the right question.
    >>>> >>>>
    >>>> >>>> Andrus
    >>>> >>>>
    >>>> >>>>
    >>>> >>>> On Jul 22, 2009, at 7:47 AM, sridhar devatha wrote:
    >>>> >>>>
    >>>> >>>>  Hi,
    >>>> >>>>>
    >>>> >>>>> I have view layer, business layer and data access layer. Each have
    >>>> >>>>> separate
    >>>> >>>>> class for carrying data. But, in data access layer, the object /
    >>>> class
    >>>> >>>>> used
    >>>> >>>>> for carrying data is respective data objects. I don't send these
    >>>> objects
    >>>> >>>>> beyond my data access layer. Rather I create business objects
    >>>> populated
    >>>> >>>>> with
    >>>> >>>>> data object data. When the business functions call data access
    >>>> layer for
    >>>> >>>>> any
    >>>> >>>>> of the CRUD operations, they pass these business objects. I convert
    >>>> these
    >>>> >>>>> business objects to data objects(So, I will create data object
    >>>> every time
    >>>> >>>>> I
    >>>> >>>>> need to convert business object to data object. So, what happens
    >>>> when the
    >>>> >>>>> two data objects(one dataobject is created while retrieving data.
    >>>> We send
    >>>> >>>>> the data as business object to business layer. one data object is
    >>>> created
    >>>> >>>>> when the user returns the modified  data in the form of business
    >>>> object)
    >>>> >>>>> of
    >>>> >>>>> the same class exist with the same data? How can I modify and
    >>>> delete the
    >>>> >>>>> respective rows of these data objects? Please answer any body. I
    >>>> did not
    >>>> >>>>> find any example that does the modification.
    >>>> >>>>>
    >>>> >>>>>
    >>>> >>>>> Yours Sincerely,
    >>>> >>>>> Devatha Sridhar
    >>>> >>>>>
    >>>> >>>>
    >>>> >>>>
    >>>> >>>
    >>>> >>>
    >>>> >>> --
    >>>> >>>
    >>>> >>> Yours Sincerely,
    >>>> >>> Devatha Sridhar
    >>>> >>>
    >>>> >>
    >>>> >>
    >>>> >>
    >>>> >>
    >>>> >
    >>>> >
    >>>> >
    >>>> >
    >>>>
    >>>
    >>>
    >>>
    >>> --
    >>>
    >>> Yours Sincerely,
    >>> Devatha Sridhar
    >>>
    >>
    >>
    >>
    >> --
    >>
    >> Yours Sincerely,
    >> Devatha Sridhar
    >>
    >
    >
    >
    > --
    >
    > Yours Sincerely,
    > Devatha Sridhar
    >



    This archive was generated by hypermail 2.0.0 : Thu Jul 23 2009 - 13:32:22 EDT