@Version property doesn't ensure integrity when performing the merge operation
------------------------------------------------------------------------------

                 Key: OPENJPA-197
                 URL: https://issues.apache.org/jira/browse/OPENJPA-197
             Project: OpenJPA
          Issue Type: Bug
          Components: jpa
    Affects Versions: 0.9.7
            Reporter: Jacek Laskowski


See the simple test case:

        {
            Query query = em.createQuery("SELECT o FROM Osoba o WHERE o.imie = 
'Jacek' AND o.nazwisko = 'Laskowski'");
            final Osoba osoba = (Osoba) query.getSingleResult();
            final Long numerOsoby = osoba.getNumer(); // numer is the pk
            long wersja = osoba.getWersja(); // wersja is a versioned property
            {
                EntityTransaction tx = em.getTransaction();
                tx.begin();
                Osoba osobaWersja0 = em.find(Osoba.class, numerOsoby);
                assert osobaWersja0.getWersja() == wersja;
                osobaWersja0.setImie("change");
                em.flush();

                wersja++;

                assert osobaWersja0.getWersja() == wersja;
                tx.commit();
                assert osobaWersja0.getWersja() == wersja;
                em.refresh(osobaWersja0);
                assert osobaWersja0.getWersja() == wersja;
            }
            {
                em.clear(); // osoba is now detached
                final String noweImie = "Yet another name change";
                osoba.setImie(noweImie);

                EntityTransaction tx = em.getTransaction();
                tx.begin();
                Osoba osobaWersja1 = em.find(Osoba.class, numerOsoby);
                osobaWersja1.setImie("and another");
                tx.commit(); // change is on its way to database

                wersja++;

                assert osobaWersja1.getWersja() == wersja;
                assert osobaWersja1.getWersja() != osoba.getWersja();

                if 
(em.getClass().getCanonicalName().equals("org.apache.openjpa.persistence.EntityManagerImpl"))
 {
                    Osoba osobaPoMerge = em.merge(osoba);

                    assert osobaPoMerge.getImie().equals(osoba.getImie());
                    assert osobaPoMerge.getImie().equals(noweImie);

                    em.getTransaction().begin();
                    try {
                        em.flush();
                        assert false;
                    } catch (/* OptimisticLock */Exception oczekiwano) {
                        em.getTransaction().rollback();
                    }
                }
            }
        }

It works fine with Apache OpenJPA 0.9.7-SNAPSHOT with the sources on the past 
Friday. Hibernate EntityManager 3.3.1 and TopLink Essentials 2.0 BUILD 40 throw 
exception as the detached entity is merged  to em. According to the spec 9.1.17 
Version Annotation p. 178 (and the javadoc - 
http://java.sun.com/javaee/5/docs/api/javax/persistence/Version.html - too):

The Version annotation specifies the version field or property of an entity 
class that serves as its optimistic lock value. The version is used to ensure 
integrity when performing the merge operation and for optimistic concurrency 
control.

So, I think that it's a bug in OpenJPA.

BTW, I'm still unable to send emails to open-jpa-dev. Who should I contact to 
in order to fix it?

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to