[hibernate-issues] [Hibernate-JIRA] Commented: (HHH-5368) Not throwing Optimistic Lock when the entity is attached

Strong Liu (JIRA) noreply at atlassian.com
Wed Feb 1 23:18:10 EST 2012


    [ https://hibernate.onjira.com/browse/HHH-5368?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=45343#comment-45343 ] 

Strong Liu commented on HHH-5368:
---------------------------------

can't reproduce it in hibernate 4.x, so, reject it here, if you still have such issue in your EAP, please make a contact with your EAP support and create a support case, thanks

> Not throwing Optimistic Lock when the entity is attached
> --------------------------------------------------------
>
>                 Key: HHH-5368
>                 URL: https://hibernate.onjira.com/browse/HHH-5368
>             Project: Hibernate ORM
>          Issue Type: Bug
>          Components: core
>    Affects Versions: 3.2.4.sp1
>         Environment: windows XP, jboss 4.3 EAP, hibernate 3.4.2.sp1
>            Reporter: Fernando Rubbo
>            Priority: Minor
>
> Hi
> Hibernate is not throwing Optimistic Lock when the entity is attached. It happens when the business rule sets a version in the attached entity that is less than its original (from database) version value.
> Take the following code as an example of the bug.
>        // inserts A
>         A a1 = new A();
>         a1.setName("A1");
>         dao.persist(a1);
>         dao.flush();
>         dao.clear();
>         // as expected, the piece of code below works just fine
>         final A a2 = dao.find(A.class, new BigDecimal(1));
>         a2.setName("A2");
>         dao.merge(a2);
>         dao.flush();
>         dao.clear();
>         // as expected, this code fails due to Optimistic Lock
>         try{
>             final A a3 = dao.find(A.class, new BigDecimal(1));
>             dao.clear();
>             a3.setName("A3");
>             a3.setVersion(0); //database verison is 1
>             dao.merge(a3);
>             dao.flush();
>             Assert.fail();
>         }catch (Exception e) {
>             System.out.println(e.getMessage());
>             // ignore
>         }finally{
>             dao.clear();
>         }
>         // unexpectedly, the piece of code below also works..
>         // even with the version being less than the one in the database
>         // Note that this happens because hibernate is holding internaly the original version of the entity. 
>         // Even when the version is manually changed it keeps using the original one. 
>         final A a3 = dao.find(A.class, new BigDecimal(1));
>         a3.setName("A3");
>         a3.setVersion(0); //database verison is 1
>         dao.merge(a3);
>         dao.flush();
>         dao.clear();
> This problem can be handled by the business rule. For example, whether the version that comes from the screen is smaller than the one from the database it could throw an Optimistic Lock exception. However, it it was not handled, hibernate must take care of this in the same way it does with detached objects.

--
This message is automatically generated by JIRA.
For more information on JIRA, see: http://www.atlassian.com/software/jira

        


More information about the hibernate-issues mailing list