Quoting
http://www.cs.bham.ac.uk/~aps/syllabi/2 ... versioning "Now whenever you make an object dirty in memory, Hibernate will update its version (in memory). Whenever the object gets flushed to disk (e.g., at the end of a transaction or because you call session.update or session.saveOrUpdate to re-attach a detached object, Hibernate will throw a StaleObjectStateException if the version number of the object on disk is not the same as it was when the object was loaded. By catching that exception, the programmer can then decide what to do about the conflict (e.g., report back to the user that the choice he/she has just made is, in fact, no longer available and could they please make another one). "
I'd say that you have 2 or more overlapping transactions, acting over the same entity instance. And, since Hibernate optimistic concurrency control doesn't allow that, you should try a locking scheme, like executing those actions within a synchronized block.