Is it possible that the update object in the database without changing the version of the object using sleep mode?
Using my web application, users can create or update objects. And where is another asynchronous process that "processes" these objects after any user operation. If the user opens the object for updating before the entity is "processed", but tries to save it after "processing", the user will receive an "OptimisticLockException", and all of his entered data will be lost. But I would like to overwrite the data updated in the asynchronous process with the data provided by the user.
code snipet to show why I need this behavior (JPA + Hibernate):
//user creates entity by filling form in web application Entity entity = new Entity (); entity.setValue("some value"); entity.setProcessed (false); em.persist(entity); em.flush(); em.clear(); //but after short period of time user changes his mind and again opens entity for update entity = em.find(Entity.class, entity.getId()); em.clear(); //em.clear just for test purposes //another application asynchronously updates entities List entities = em.createQuery( "select e from Entity e where e.processed = false") .getResultList(); for (Object o: entities){ Entity entityDb = (Entity)o; someTimeConsumingProcessingOfEntityFields(entityDb); //update lots of diferent entity fields entityDb.setProcessed(true); em.persist(entityDb); } em.flush(); //version of all processed entities are incremented. //Is it possible to prevent version increment? em.clear(); //user modifies entity in web application and again press "save" button em.merge(entity); //em.merge just for test purposes entity.setValue("some other value"); entity.setProcessed (false); em.persist(entityDb); em.flush(); //OptimisticLockException will occur. //Is it possible to prevent this exception from happening? //I would like to overwrite data updated in asynchronous process //with user provided data.
And my essence:
@Entity @Table(name = "enities") public class Entity implements Serializable { @Id @GeneratedValue(strategy = GenerationType.AUTO) private Long id; @Version private int versionNum; @Column private String value @Column private boolean processed;
In fact, I have a lot more classes with a similar problem - so I'm looking for a few elegant non - intrusive solutions.
It seems to me that this is a very common scenario. But I could not find any information on how to achieve such functionality.
source share