JPA - Using OPTIMISTIC_FORCE_INCREMENT lock mode to force version increment

[Updated: Dec 18, 2017, Created: Dec 18, 2017]

LockModeType.OPTIMISTIC_FORCE_INCREMENT can be used to apply optimistic lock with version update. Unlike the default LockModeType.OPTIMISTIC mode, the version is updated even though there's no change with the entity in this case.

Example

The Entity

@Entity
public class Article {
  @Id
  @GeneratedValue
  private long id;
  @Version
  private long version;
  private String content;
    .............
}

Using OPTIMISTIC_FORCE_INCREMENT

public class ForceIncrementExample {
  private static EntityManagerFactory entityManagerFactory =
          Persistence.createEntityManagerFactory("example-unit");

  public static void main(String[] args) {
      try {
          persistArticle();
          updateArticle();
      } finally {
          entityManagerFactory.close();
      }
  }

  private static void updateArticle() {
      System.out.println("-- updating article --");
      EntityManager em = entityManagerFactory.createEntityManager();
      Article article = em.find(Article.class, 1L);
      em.getTransaction().begin();
      em.lock(article, LockModeType.OPTIMISTIC_FORCE_INCREMENT);
      if (article.getContent().length() < 5) {
          article.setContent("updated content");
      }
      em.getTransaction().commit();
      em.close();
      System.out.println("Article updated : " + article);
  }

  public static void persistArticle() {
      System.out.println("-- persisting article --");
      Article article = new Article("test article");
      EntityManager em = entityManagerFactory.createEntityManager();
      em.getTransaction().begin();
      em.persist(article);
      em.getTransaction().commit();
      em.close();
      System.out.println("Article persisted: " + article);
  }
}
-- persisting article --
Article persisted: Article{id=1, version=0, content='test article'}
-- updating article --
Article updated : Article{id=1, version=1, content='test article'}

As seen above, the Article's version has increased even though there's was no change with the entity.

In the next example we will see a use case of when to use this lock mode.

Example Project

Dependencies and Technologies Used :

  • h2 1.4.196: H2 Database Engine.
  • hibernate-core 5.2.12.Final: The core O/RM functionality as provided by Hibernate.
  • JDK 1.8
  • Maven 3.3.9

OPTIMISTIC_FORCE_INCREMENT Example Select All Download
  • optimistic-force-increment-example
    • src
      • main
        • java
          • com
            • logicbig
              • example
        • resources
          • META-INF

See Also