Hi Alexander, Those are also good suggestions for implementing this feature.
Thanks, mrg On Fri, May 5, 2017 at 9:19 AM, Alexander <lex.f...@gmail.com> wrote: > Hi, > > thank you and Maik for answering so fast. You saved me a lot of time > searching around for nothing. > > Your suggestion seems to be the right approach. > I’d consider making the read-only flag in the ObjectContext final, as to > prevent unintended changes. Therefore it has to be set in the > ObjectContext’s constructor. > > A fail fast behavior should be considered for nested ObjectContexts, i.e. > commitChangesToParent() should check the parent’s read-only flag, unless > the nested context’s read-only flag is copied from the parent on > instantiation (in this case ObjectContextFactory class has to be changed > too).. > > Let’s hope this feature will be added before 4.0 final. > > For now subclassing is a good option. > > Thanks again > Alexander > > > On 2017-05-05 13:08 (+0200), Michael Gentry <blackn...@gmail.com> wrote: > > #2 should've read: > > > > 2. Alter CayenneDataObject to check the entity's read-only status AND the > > context's read-only status. (Change writeProperty(), etc.) If either is > > read-only and you are trying to sneak a change in, throw an exception. > > > > mrg > > > > > > On Fri, May 5, 2017 at 7:04 AM, Michael Gentry <blackn...@gmail.com> > wrote: > > > > > Hi Alexander, > > > > > > I don't believe what you are asking for is currently doable, even in > the > > > latest 4.0 milestone release. > > > > > > An ObjectContext doesn't know anything about read-only. You can make a > > > Cayenne object read-only in Cayenne Modeler, however this just omits > > > setter-type methods. CayenneDataObject, which all Cayenne database > objects > > > inherit from, doesn't actually restrict setting values if you flag it > as > > > read-only in the modeler. You can directly call writeProperty(), > > > writePropertyDirectly(), removeToManyTarget(), etc on the objects. > > > > > > I think this feature would be fairly easy to add (the information is > > > already in the model's XML files [1]), so perhaps it could be added > before > > > 4.0 final. > > > > > > I'd suggest: > > > > > > 1. Add a read-only flag to DataContext and friends. If you call > > > commitChanges() on a read-only context, throw an exception. > > > 2. Alter each CayenneDataObject which modifies data (writeProperty(), > etc) > > > to check the entity's read-only status AND the context's read-only > status. > > > If either is read-only and you are trying to sneak a change in, throw > an > > > exception. > > > > > > Does this sound like the right approach (to you and other Cayenne > users)? > > > > > > As to your localObject() question, I think it should adhere to the 1/2 > > > semantics I just mentioned. > > > Thanks, > > > > > > mrg > > > > > > [1] <obj-entity name="..." className="..." readOnly="true" > > > dbEntityName="..." superClassName="..."> > > > > > > > > > > > > On Fri, May 5, 2017 at 6:29 AM, Alexander <lex.f...@gmail.com> wrote: > > > > > >> Hi, > > >> > > >> I searched for a while, but wasn’t able to find a solution to make an > > >> ObjectContext “read-only”. > > >> Maybe I'm missing something. > > >> > > >> The point is: > > >> As suggested many times, there are situations where it makes sense to > > >> have a shared read-only ObjectContext and other ObjectContexts to > commit > > >> changes. > > >> I can certainly handle two and more ObjectContexts, but I need to lock > > >> out other users / applications which can somehow gain access to > persistent > > >> objects instantiated through the assumed read-only shared context, > since > > >> any application that has access to such objects (maybe obtained from a > > >> service class that is expected to return read-only objects) could > simply > > >> call object.getObjectContext().commitChanges(). By the way, this > would > > >> also commit unwanted temporary changes that happen elsewhere in the > main > > >> application or in the service class. > > >> > > >> Is there a method like CONTEXT.makeReadOnly() to make sure that any > > >> objects that resides in this specific ObjectContext cannot be changed? > > >> Even better, is there a way to let persistent objects, that are bound > to > > >> a read-only context, throw an exception? > > >> > > >> Should this be possible, there is only one question left: would it > still > > >> be possible to transfer objects retrieved through a read-only > > >> ObjectContext to a read-write ObjectContext, by calling > > >> localObject(readWriteContext)? > > >> > > >> Any help would be greatly appreciated. > > >> Alexander > > >> > > >> > > > > > >