[ https://issues.apache.org/jira/browse/OPENJPA-197?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#action_12486089 ]
Jacek Laskowski commented on OPENJPA-197: ----------------------------------------- As I'm unable to write to the dev mailing list I'm responding to Abe White's comment here that reads "No, the exception can be deferred until flush/commit. Read section 3.2.4.1." The spec says in 3.2.4.1 p. 52: Any Version columns used by the entity must be checked by the persistence runtime implementation during the merge operation and/or at flush or commit time. So, one could agree with Abe (the and/or is the key). Reading about it further, the spec says in 9.1.17 p. 178: "The version is used to ensure integrity when performing the merge operation and for optimistic concurrency control." and there's nothing about flush/commit time. Also, verifying it against RI (which is alas TopLink Essentials) leads to the same conclusion and it seems that it's only OpenJPA who thinks differently. I wish I could give it a shot with other JPA providers than OpenJPA, TopLink and Hibernate (but would that change anything?). > @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.