Locking optimistic

Run
How to run the sample
The source code for this sample can be found in the javaee7-samples GitHub repository. The first thing we need to do is to get the source by downloading the repository and then go into the samples folder:
git clone git://github.com/javaee-samples/javaee7-samples.git
cd javaee7-samples/jpa/locking-optimistic/
Now we are ready to start testing. You can run all the tests in this sample by executing:
mvn test
Or you can run individual tests by executing one of the following:
mvn test -Dtest=LockingOptimisticTest

LockingOptimisticTest

Missing a description for the story. Add some javadoc to the TestClass. Show me how!
Missing a description for the deployment. Add some javadoc to the @Deployment method. Show me how!
@Deployment
public static WebArchive createDeployment() {
    BeansDescriptor beansXml = Descriptors.create(BeansDescriptor.class);

    WebArchive war = ShrinkWrap.create(WebArchive.class)
            .addPackage("org.javaee7.jpa.locking.optimistic")
            .addAsResource("META-INF/persistence.xml")
            .addAsResource("META-INF/load.sql")
            .addAsWebInfResource(
                    new StringAsset(beansXml.createAlternatives()
                            .clazz(MovieBeanAlternative.class.getName()).up().exportAsString()),
                    beansXml.getDescriptorName());
    System.out.println(war.toString(true));
    return war;
}
Missing a description for the test scenario. Add some javadoc to the @Test method. Show me how!
@Test
public void testLockingOptimisticUpdateAndRead() throws Exception {
    resetCountDownLatches();
    List<Movie> movies = movieBean.listMovies();
    assertFalse(movies.isEmpty());

    final CountDownLatch testCountDownLatch = new CountDownLatch(1);

    executor.execute(new Runnable() {
        @Override
        public void run() {
            movieBean.updateMovie(3, "INCEPTION UR");
            testCountDownLatch.countDown();
        }
    });

    executor.execute(new Runnable() {
        @Override
        public void run() {
            movieBean.findMovie(3);
            MovieBeanAlternative.lockCountDownLatch.countDown();
        }
    });

    assertTrue(testCountDownLatch.await(10, TimeUnit.SECONDS));
    assertEquals("INCEPTION UR", movieBean.findMovie(3).getName());
}
Missing a description for the test scenario. Add some javadoc to the @Test method. Show me how!
@Test
public void testLockingOptimisticReadAndUpdate() throws Exception {
    resetCountDownLatches();
    List<Movie> movies = movieBean.listMovies();
    assertFalse(movies.isEmpty());

    final CountDownLatch testCountDownLatch = new CountDownLatch(1);

    executor.execute(new Runnable() {
        @Override
        public void run() {
            try {
                movieBean.readMovie(3);
            } catch (RuntimeException e) { // Should throw an javax.persistence.OptimisticLockException? Hibernate is throwing org.hibernate.OptimisticLockException. Investigate!
                testCountDownLatch.countDown();
            }
        }
    });

    executor.execute(new Runnable() {
        @Override
        public void run() {
            MovieBeanAlternative.lockCountDownLatch.countDown();
            movieBean.updateMovie(3, "INCEPTION RU");
            MovieBeanAlternative.readCountDownLatch.countDown();
        }
    });

    assertTrue(testCountDownLatch.await(10, TimeUnit.SECONDS));
    assertEquals("INCEPTION RU", movieBean.findMovie(3).getName());
}
Missing a description for the test scenario. Add some javadoc to the @Test method. Show me how!
@Test
public void testLockingOptimisticDelete() throws Exception {
    resetCountDownLatches();
    List<Movie> movies = movieBean.listMovies();
    assertFalse(movies.isEmpty());

    final CountDownLatch testCountDownLatch = new CountDownLatch(1);

    executor.execute(new Runnable() {
        @Override
        public void run() {
            try {
                movieBean.updateMovie(3, "INCEPTION");
            } catch (RuntimeException e) { // Should throw an javax.persistence.OptimisticLockException? The Exception is wrapped around an javax.ejb.EJBException
                testCountDownLatch.countDown();
            }
        }
    });

    executor.execute(new Runnable() {
        @Override
        public void run() {
            movieBean.deleteMovie(3);
            MovieBeanAlternative.lockCountDownLatch.countDown();
        }
    });

    assertTrue(testCountDownLatch.await(10, TimeUnit.SECONDS));
}

Share the Knowledge

Find this sample useful? Share on

There's a lot more about JavaEE to cover. If you're ready to learn more, check out the other available samples.

Help Improve

Find a bug in the sample? Something missing? You can fix it by editing the source, making the correction and sending a pull request. Or report the problem to the issue tracker

Recent Changelog

  • Dec 05, 2014: Added tests for locking-optimistic project by Roberto Cortez
  • Jul 15, 2014: Removed header license. the licensing is now referenced in the license file in the root of the project by Roberto Cortez
  • Oct 30, 2013: Removing load.sql as data needs to be persisted using entitymanager.persist instead of insert into. this allows the version column to be updated for optimistic locking to work. eclipselink was lenient about it but hibernate caught it by Arun Gupta
  • Sep 17, 2013: Removing netbeans configuration file by Arun Gupta
  • Aug 27, 2013: Moving the source code from http://svn.java.net/svn/glassfish~svn/branches/arun/javaee7-samples/samples/ by Arun Gupta
How to help improve this sample
The source code for this sample can be found in the javaee7-samples GitHub repository. The first thing you need to do is to get the source by downloading the repository and then go into the samples folder:
git clone git://github.com/javaee-samples/javaee7-samples.git
cd javaee7-samples/jpa/locking-optimistic/

Do the changes as you see fit and send a pull request!

Good Luck!