My problem arises through merge() operation that utilizes session.get() at DefaultMergeEventListener.entityIsDetached() which in turn is aware only of ObjectNotFoundException and not ENFE (as it should). This happens mainly because instance with assigned id was assumed to be detached and ENFE was not catched. The comment lines below state the situation as well (persistent should be transient in the last sentence, I presume).
//TODO: we should throw an exception if we really *know* for sure
// that this is a detached instance, rather than just assuming
//thrownew StaleObjectStateException(entityName, id);
// we got here because we assumed that an instance
// with an assigned id was detached, when it was
// really persistent
entityIsTransient( event, copyCache );