Check this out https://forum.hibernate.org/viewtopic.php?f=1&t=957807
Sent from my iPhone On May 29, 2011, at 10:06 PM, Donny Nadolny <donny.nado...@gmail.com> wrote: > Hi Taha, > > That would be a reasonable place to hook it in. However, I'd like to make > sure that it would work first, and it seems like in principle it's the same > as the 4th way I tried (which didn't work): store the current version when > the form is rendered, then when you save you grab the latest from the > database but first set the version to be the version when the form was > rendered. I still don't understand why that didn't work. > > Donny > > On Sun, May 29, 2011 at 12:24 PM, Taha Hafeez <tawus.tapes...@gmail.com>wrote: > >> Hi Donny >> >> One way I can think of is extend AbstractSessionPersistentFieldStrategy as >> is done by EntityPersistentFieldStrategy(tapestry-hibernate) and store >> version in addition to id and type in PersistedEntity and later >> while retrieving the value, check the version too >> >> Take a lot at >> >> https://svn.apache.org/repos/asf/tapestry/tapestry5/tags/releases/5.2.5/tapestry-hibernate/src/main/java/org/apache/tapestry5/internal/hibernate/EntityPersistentFieldStrategy.java >> < >> https://svn.apache.org/repos/asf/tapestry/tapestry5/tags/releases/5.2.5/tapestry-hibernate/src/main/java/org/apache/tapestry5/internal/hibernate/EntityPersistentFieldStrategy.java >>> >> >> regards >> Taha >> >> >> On Sun, May 29, 2011 at 9:48 PM, Donny Nadolny <donny.nado...@gmail.com >>> wrote: >> >>> Hi Josh, >>> >>> Yup, it must be. The question is, how do I stop that? I tried following >> the >>> example from the jumpstart demo but it didn't work, and I tried setting >> the >>> version field manually, and it still didn't work (the exact code I used >> is >>> in the initial email). >>> >>> On Sun, May 29, 2011 at 12:11 PM, Josh Canfield <joshcanfi...@gmail.com >>>> wrote: >>> >>>> I would guess that you are pulling the object from the database when >> you >>>> post the form, and thus editing the current version. >>>> >>>> I believe is the default behaviour with the tapestry persistent object >>>> translator, it stores the type and id in the form. >>>> >>>> Josh >>>> On May 29, 2011 7:34 AM, "Donny Nadolny" <donny.nado...@gmail.com> >>> wrote: >>>>> I've got a BeanEditForm for my User entity which has a version field: >>>>> >>>>> @Version >>>>> public long getVersion() { >>>>> return version; >>>>> } >>>>> public void setVersion(long version) { >>>>> this.version = version; >>>>> } >>>>> >>>>> I've got an admin screen to edit a user, and I would like to make >> sure >>> I >>>>> don't overwrite changes made by the user (they can change their >>> password, >>>>> for example) or by the application, while I'm on the edit screen. >> I've >>>> tried >>>>> a few things, but I always see the same behavior: any changes in the >>>>> database get overwritten when I hit "save" in the BeanEditForm. >>>>> >>>>> Test 1: >>>>> EditUser.tml: >>>>> <t:BeanEditForm object="user" t:id="editUserForm"/> >>>>> >>>>> EditUser.java: >>>>> @CommitAfter >>>>> public Object onSuccessFromEditUserForm() { >>>>> return UserIndex.class; >>>>> } >>>>> >>>>> I open the EditUser page in the browser, I change the user in the >>>> database >>>>> (increasing the version field by one), then I hit save in the >> browser, >>>>> expecting Hibernate to throw an exception. Instead, it saves the >>> changes, >>>>> increasing the version again. Eg I start at version 0, open the page, >>>> edit >>>>> the db to change a field and set version to 1, then I hit save in the >>>>> browser, it clobbers my changes and sets version to be 2. >>>>> >>>>> >>>>> Test 2: >>>>> I tried out the code from JumpStart >>>>> >>>> >>>> >>> >> http://jumpstart.doublenegative.com.au/jumpstart/examples/easycrud/update/2which >>>>> says it handles versioning. My code now looks like this: >>>>> tml: >>>>> <t:BeanEditForm object="user" t:id="editUserForm"> >>>>> <p:version> >>>>> <t:hidden value="user.version"/> >>>>> </p:version> >>>>> </t:BeanEditForm> >>>>> >>>>> The java code is the same as Test 1. >>>>> >>>>> Again, the changes get clobbered. >>>>> >>>>> Test 3: >>>>> I noticed that the hidden field didn't have an ID set, so I tried: >>>>> <t:hidden value="user.version" t:id="version"/> >>>>> Same thing, changes get overwritten. >>>>> >>>>> Test 4: >>>>> Managing the version myself. In the tml I have: >>>>> <t:BeanEditForm object="user" t:id="editUserForm"> >>>>> <p:version> >>>>> <t:hidden t:id="versionWhenLoaded"/> >>>>> </p:version> >>>>> </t:BeanEditForm> >>>>> >>>>> In java, I have: >>>>> @PageActivationContext >>>>> private User user; >>>>> >>>>> @Property >>>>> private long versionWhenLoaded; >>>>> >>>>> public void setupRender() { >>>>> versionWhenLoaded = user.getVersion(); >>>>> } >>>>> >>>>> @CommitAfter >>>>> public Object onSuccessFromEditUserForm() { >>>>> user.setVersion(versionWhenLoaded); >>>>> return UserIndex.class; >>>>> } >>>>> >>>>> Again, changes get overwritten. I really would expect the last case >> to >>>> work >>>>> - maybe I need to do something special in Hibernate to set the >> version >>>>> field? >>>>> >>>>> I'm using tapestry 5.2.4, the tapestry-hibernate dependency (so >>> Hibernate >>>>> 3.6.0-Final). >>>>> >>>>> I've confirmed that Hibernate does throw a >>>>> StaleObjectStateExceptionexception when it tries to make changes to >>>>> the user at the same time, by >>>>> having another page which does, essentially: >>>>> User user = userDAO.findById(1); >>>>> timeProvider.sleep(10000); >>>>> user.setFirstName("something different"); >>>>> sessionManager.commit(); >>>>> I load it twice, and the second page throws >> StaleObjectStateException. >>>>> >>>>> Any ideas? >>>> >>> >> --------------------------------------------------------------------- To unsubscribe, e-mail: users-unsubscr...@tapestry.apache.org For additional commands, e-mail: users-h...@tapestry.apache.org