If I understood correctly, you expect Cayenne to automatically
initialize 'version' to zero and, on each subsequent UPDATE, to
automatically increment the value?
If so, that is not what optimistic locking does (at least, I'm assuming
Cayenne works the way EOF does in this regard, since I haven't had time
to use the new optimistic locking features).
Let's say you have a User table, with firstName, lastName, and
favoriteColor fields (plus a primary key, but we don't really care about
that), all of which are locking attributes:
firstName: Mary
lastName: Johnson
favoriteColor: Red
Then Mary gets married and changes her last name to "Jones" and you do a
setLastName("Jones") on that record (after fetching it into memory, of
course). When you save the changes, Cayenne should issue something like
this:
UPDATE User SET lastName = 'Jones'
WHERE firstName = 'Mary' AND lastName = 'Johnson' AND favoriteColor =
'Red' AND primaryKey = ...
Basically, any attributes marked as used for locking are included in a
WHERE clause with their previous values present. Also, only the
attributes that changed values should be present in the SET clause.
Be sure you do not use BLOBs as locking attributes! I'd even suggest
having BLOBs in their own table.
If you want to use a 'version' column, you can do that, but it'll
probably be more manual on your part (initializing and incrementing
yourself) and is less effective. When the original values are checked
in the UPDATE clause, it helps ensure data integrity even when someone
(production support) goes in and updates a DB value by hand (they'd most
likely not update the 'version' column) or if there is another
application which shares the DB and does updates and doesn't use all the
nice Cayenne framework code you've written.
Hope that helps.
/dev/mrg
-----Original Message-----
From: Bill Dudney [mailto:bdudne..ac.com]
Sent: Tuesday, June 08, 2004 5:58 AM
To: cayenne-use..bjectstyle.org
Subject: optimistic locking?
Hi All,
I would like to introduce a 'version' property on my objects and use it
for optimistic locking.
I modified my model to add optimistic locking (with the checkbox
'Optimistic Locking' in the Entity tab) to each of my classes and
specified which attributes in each was 'Used for Locking' (the version
attribute).
I expected Cayenne to automatically set the 'version' attribute to zero
on initialization and then maintain its value with each commit. i.e.
Create Foo, version = 0, update Foo version = 1 and I don't have to
know or care about this version field. It did not so I initialize it to
zero in the default constructor. Is this the expected usage?
Thanks!
-bd-
This archive was generated by hypermail 2.0.0 : Tue Jun 08 2004 - 10:30:53 EDT