Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
Re: [eclipselink-users] Optimistic Lock Exception expected

A lock error should occur on your merge() call, it is unexpected if it does

Ensure that you have an @Version in your object.  If still not getting the
error please include the code for your class and the log on finest of your

Mathias Koehnke - Sun Microsystems wrote:
> Hi,
> while replacing Toplink Essentials (2.0.1-b04-fcs (04/11/2008)) by 
> EclipseLink 1.1 for a Java SE project, I came across a problem that 
> prevents me from switching: I would expect getting an Optimistic Lock 
> exception in case an entity gets removed from the database (by another 
> thread or whatever) and one tries to commit on a still-existing runtime 
> object of that entity. That was my expectation and it worked with 
> Toplink Essentials so far. Using EclipseLink it doesn't throw an OL 
> exception, instead the entity gets re-inserted in the database.
> Am I using JPA/EclipseLink the wrong way or do I miss something? From my 
> understanding the following example should throw an OL exception when 
> committing the last transaction:
> Entity entity = new Entity();
> entity.setValue("entity");
> //persist "entity" and create clone "entityCopy"
> EntityManager em1 = getEntityManagerFactory().createEntityManager();
> em1.getTransaction().begin();
> em1.persist(entity);
> em1.getTransaction().commit();
> Entity entityCopy = em1.find(Entity.class, entity.getId());
> em1.close();
> //delete "entity" from database
> EntityManager em2 = getEntityManagerFactory().createEntityManager();
> em2.getTransaction().begin();
> entity = em2.merge(entity);
> em2.remove(entity);
> em2.getTransaction().commit();
> em2.close();
> //merge clone "entityCopy" and commit
> EntityManager em3 = getEntityManagerFactory().createEntityManager();
> em3.getTransaction().begin();
> entityCopy = em3.merge(entityCopy);
> em3.lock(entityCopy, LockModeType.WRITE);
> em3.getTransaction().commit();
> em3.close();
> Note: I already added a SessionCustomizer modifying the session the 
> following way:
> session.getProject().assumeExistenceForDoesExist();
> So, EclipseLink shouldn't check the database for the existence of the 
> entity at all. Instead it should assume that the entity exists and 
> simply execute an "UPDATE ..." sql statement.
> Thanks for your help in advance.
> Best regards,
> Mathias Koehnke

--- James Sutherland
 EclipseLink ,
Wiki: EclipseLink , TopLink 
Forums: TopLink , EclipseLink 
Book: Java Persistence 
View this message in context:
Sent from the EclipseLink - Users mailing list archive at

Back to the top