Hi all,
Long time EOF/WebObjects user, new to Cayenne. I’m finding a lot of Cayenne is
very similar to EOF. There are clearly major differences too. One of these is
the ServerRuntime concept. It seems like it is fairly similar to an
EOObjectStoreCoordinator at first glance, but I’m finding it is quite
different.
Let me share some code to illustrate my confusion:
final ServerRuntime first = new ServerRuntime("cayenne-project.xml");
final ServerRuntime second = new ServerRuntime("cayenne-project.xml");
final ServerRuntime third = new ServerRuntime("cayenne-project2.xml");
final ObjectContext oc = first.newContext();
final ObjectContext oc2 = second.newContext(oc);
final ObjectContext oc3 = third.newContext(oc);
final ObjectContext oc4 = third.newContext();
final ObjectContext oc5 = first.newContext(oc4);
final Customer c1 = Customer.customerForLoginId(oc, "login id");
final Customer c2 = Customer.customerForLoginId(oc2, "login id");
final Customer c3 = Customer.customerForLoginId(oc3, "login id");
final Customer c4 = Customer.customerForLoginId(oc4, "login id");
final Customer c5 = Customer.customerForLoginId(oc5, "login id");
where
public static Customer customerForLoginId(final ObjectContext context, final
String loginId) {
return SelectQuery.query(Customer.class,
LOGIN_ID.eq(loginId)).selectOne(context);
}
cayenne-project.xml contains all my cayenne models. cayenne-project2.xml is
entirely empty. Exceptions are not thrown until the last two lines fetching c4
and c5. I didn’t expect to make it past oc2. I only expected c1 to work for
fetching.
In the given situation, I’m obviously working on authentication. In the EOF
code there is a process that logs a login attempt. In order to do that in EOF,
I use a peer editing context to create, edit, and save the log object to the
database. Therefore, I need a way to get a peer ObjectContext given an
ObjectContext. Thus far, the best I’ve come up with is to have a public static
final ServerRuntime stashed on a utility class, and use that one instance for
everything… but this seems to go against all the work done with dependency
injection. I tried to follow the advice found in this message,
http://cayenne.markmail.org/search/?q=peer+objectcontext#query:peer%20objectcontext+page:2+mid:v77r6qhv6c4m72iy+state:results
but storing the Injector in the user properties breaks serialization of the
ObjectContext. Is there an easy way to get a peer OC that I am missing? Also,
how do I know the OC is appropriate for something like a SelectQuery? Do I need
to wrap all calls in try blocks in case some code hands in the wrong
ServerRuntime’s OC?
Thanks,
Ramsey