I'm still not 100% certain your workflow/etc, but here are some thoughts.

Cayenne doesn't really have a disconnect/reconnect feature, which
sounds a bit like something Hibernate would have.  The Cayenne
DataContext is a work area to manage your objects.  Anything you
change in it is, conceptually, part of a transaction of changes you
want committed to the database.  If you need two different
transactions, you can use two DataContexts or possibly even a nested
DataContext if that fits your workflow.  Also, you could make your
method look more like:

  public doSomething() {
     UserDataObject udo= m_userService.getUserXXX(...);
     udo.setXXX(...);
     udo.setXXX(...);
     udo.setXXX(...);

     m_userService.saveUser(uod);

     AppointementDataObject ado=
m_appointementService.getAppointemetXXX(...);
     ado.setXXX(...);
     ado.setXXX(...);
     ado.setXXX(...);
  }

You could also have your service layer receive as a parameter the
DataContext to use in which to load/save, which would give you more
flexibility.

In all my years of using WebObjects, which includes EOF and is very
similar to Cayenne, I've never needed to disconnect/reconnect my
database objects.  Even using Tapestry/Cayenne, which is a lot like
WebObjects, I've not needed to do that.  I think if you tweak your
pattern a bit you'll find it can work very well for you.

/dev/mrg



On 7/23/06, Jonathan Bélisle <[EMAIL PROTECTED]> wrote:
I need the second DataContext for the following reasons :

I have a service class for business logic.
It's the service class that is responsible for accessing the database.
The UI layer calls the service class and gets a DataObject or a list of
DataObjects.
The UI Layer perform some modification on the objects and then call
the service to save the data and perform extra work.

For this to work, the dataobjects returned by the service must have a
datacontext or I won't be able
to modified the relationships in the UI layer.
The second DataContext is needed when I call the service to save the
data. I need to be sure that there is no other object in the dataContext
that will be saved on commitChanges except the ones pass to the method.

Class UserService {

    public UserDataObject getUserXXX(...) {
        List results=
DataContext.getThreadDataContext().performQuery(new
SelectQuery(User.class.....);
        ...
       return (UserDataObject) result.get(x);
    }

    public void saveUser(UserDataObject udo) {
        DataContext writeDc= DataContext.createDataContext();
        udo= writeDc.localObject(udo.getObjectId(), udo);

          ... Perform extra work, send email, log, extra validation,  ...

         writeContext.commitChanges();
    }
}

Class UIWebPage {

    public doSomething() {
       UserDataObject udo= m_userService.getUserXXX(...);
       udo.setXXX(...);
       udo.setXXX(...);
       udo.setXXX(...);

       AppointementDataObject ado=
m_appointementService.getAppointemetXXX(...);
       ado.setXXX(...);
       ado.setXXX(...);
       ado.setXXX(...);

       m_userService.saveUser(uod);
    }
}

If i don't use another dataContext in saveUser, the appointement will
get saved too.
What i really would like to be able to do, is to be able to
disconnect/reconnect the dataObjects.
This way, the service disconnect the dataObjects before returning them
to the client and reconnect them when saving them.
Is it possible with cayenne ?
I have tried unregister/register the objects but you cannot modify the
relationships when there is no dataContext.
I also need cayenne to be able to update only the modified properties
when i reconnect them, not all the properties.

I've been struggling with this issue for a while. Can someone help me on
this.
I'm using cayenne in a project where multiple UI access the service
layer; Tapestry and Swing.

Jonathan.


Michael Gentry wrote:
> At the risk of asking silly questions, why do you need the second
> DataContext?  If you do need the second one, could you wait until you
> pull the object into the second context to do the setters?  (So the
> second context sets modified correctly.)
>
> Your comment about Cayenne not thinking an object is modified is
> correct.  If you have:
>
> if (object.getFirstName().equals("Michael"))
> {
>    object.setFirstName("michael");
>    object.setFirstName("Michael");
> }
>
> You essentially haven't modified the object and Cayenne figures this out.
>
> Thanks,
>
> /dev/mrg
>
>
> On 7/23/06, Jonathan Bélisle <[EMAIL PROTECTED]> wrote:
>> Hi, here is my problem.
>>
>> I have a DataObject da1 registered with DataContext dc1.
>> I perform modification on da1. It's persistence state becomes MODIFIED.
>>
>> Now I want to move da1 to DataContext dc2 and keep it's state MODIFIED
>> so that when I do dc2.commitChanges(); da1 get written to the database.
>>
>> Using dc2.localObject(da1.getObjectId(), da1) doesn't work because it's
>> set the persistence state to COMMITTED and loose
>> track of witch properties were modified.
>> Even if I do da1.setPersistanceState(PersistenceState.MODIFIED) after
>> localObject() da1 does not get written to the database on the next
>> commit because dc2 thinks that no properties were modified.
>>
>> Anybody know how to do that, a workaround ?
>>
>> Thanks in advance, Jonathan.
>>
>>
>>
>>
>>
>
>
>



Reply via email to