The link http://jumpstart.doublenegative.com.au/jumpstart/examples/easycrud
has been replaced by:

        
http://jumpstart.doublenegative.com.au/jumpstart/previews/easycrud/persons

On 30/05/2011, at 12:34 AM, Donny Nadolny 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

Reply via email to