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 <jonathan.belisl..cda.ca> 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 <jonathan.belisl..cda.ca> 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.
> >>
> >>
> >>
> >>
> >>
> >
> >
> >
>
>
>
This archive was generated by hypermail 2.0.0 : Mon Jul 24 2006 - 10:54:55 EDT