java - OptimisticLocking is not working in eclipse link -


i working on project , due issue changing pessimistic locking optimistic locking. while doing getting error while updating entity in code tried standalone application there no chance 2 threads updating simultaneously. checked value of version in different part of code. showing 0. while calling flush or commit giving excepion updated 1.

note: added @version int version_id field in entity optimisticlocking.

the code below:

            workitem tmp_workitem=entitymanager.find(workitem.class , workitem.getentitykey());          logger.info("before merge"+ tmp_workitem.getversion());          entitymanager.merge(workitem);         tmp_workitem=entitymanager.find(workitem.class , workitem.getentitykey());         logger.info("after merge"+tmp_workitem.getversion()+" "+workitem.getversion());         //logger.info(entitymanager.getlockmode(workitem.class).tostring());         entitymanager.flush();         logger.info("after flush"+tmp_workitem.getversion());         response = true; 

this code throwing exception :

getversion : 1 ] cannot updated because has changed or been deleted since last read.  class> com.csg.ib.cobra.domain.workitem primary key> [9553]     @ org.eclipse.persistence.internal.sessions.repeatablewriteunitofwork.committodatabase(repeatablewriteunitofwork.java:549)     @ org.eclipse.persistence.internal.sessions.unitofworkimpl.committodatabasewithprebuiltchangeset(unitofworkimpl.java:1559 

the values of version in logger :

before merge : 0 0 after merge : 0 0 before flush: 0 0

then how can incresed 1 while calling entitymanger.flush()

)

in general, in contrast id field, updated on persist operation, version field updated when data flushed database, either using commit or flush. reason why version field value 0 until entitymanager.flush called. alternatively using transaction.commit if using resource local transaction.

regarding exception getting in application code, useful have more complete code example, maybe in form of junit test. have created following simple tests demonstrate correct behavior, hope helpful:

@test public void testoptimisticlocking() {     optimisticentity entity = new optimisticentity();     entity.setname("some name");      entitytransaction transaction = entitymanager.gettransaction();     transaction.begin();     try {         entitymanager.persist(entity);         transaction.commit();     } catch (exception x) {         transaction.rollback();         assert.fail("failed commit: " + x.getmessage());     }      int id = entity.getid();     int version = entity.getversion();     assert.asserttrue(id > 0);     assert.asserttrue(version > 0);      entity = entitymanager.find(optimisticentity.class, id);     assert.assertnotnull("entity not retrieved", entity);     assert.assertequals("entity version retrieved not expected", version, entity.getversion());      entity.setname("another name");     transaction.begin();     try {         entitymanager.merge(entity);         transaction.commit();     } catch (exception x) {         transaction.rollback();         assert.fail("failed merge: " + x.getmessage());     }             assert.assertequals("entity version not incremented after merge", version+1, entity.getversion()); }  @test public void testoptimisticlockingonetransaction() {     optimisticentity entity = new optimisticentity();     entity.setname("some name");      entitytransaction transaction = entitymanager.gettransaction();     transaction.begin();     try {         entitymanager.persist(entity);          int id = entity.getid();         int version = entity.getversion();         assert.asserttrue(id > 0);         assert.assertequals(0, version);          optimisticentity retrievedentity = entitymanager.find(optimisticentity.class, id);         assert.assertnotnull("entity not retrieved", retrievedentity);         assert.assertequals("entity version retrieved not expected", 0, retrievedentity.getversion());          entity.setname("another name");         entitymanager.merge(entity);         assert.assertequals("entity version changed after merge", 0, entity.getversion());          retrievedentity = entitymanager.find(optimisticentity.class, id);         assert.assertnotnull("entity not retrieved", retrievedentity);         assert.assertequals("entity version retrieved not expected", 0, retrievedentity.getversion());          entitymanager.flush();         assert.assertequals("entity version not incremented after flush", 1, entity.getversion());         transaction.commit();     } catch (exception x) {         transaction.rollback();         assert.fail("an error occurred: " + x.getmessage());     } } 

Comments

Popular posts from this blog

java - Plugin org.apache.maven.plugins:maven-install-plugin:2.4 or one of its dependencies could not be resolved -

Round ImageView Android -

How can I utilize Yahoo Weather API in android -