1) Также может быть проблема с вашим текущим дизайном. persist
не сразу вставляет строку в базу данных. Это происходит при фиксации транзакции при возврате метода.
Таким образом, вы разблокируете таблицу перед фактической вставкой:
// save
entityManager.persist(entity) // -> There is no INSERT at this point.
// unlock
entityManager.createNativeQuery("UNLOCK TABLES").executeUpdate()
2) Возвращаясь к тому, как сделать это только с JPA без нативов (это все еще требует некоторого обходного решения, поскольку оно не поддерживается по умолчанию):
// lock table by loading one existing entity and setting the LockModeType
Entity lockedEntity = entityManager.find(Entity.class, 1, LockModeType.PESSIMISTIC_WRITE);
// get current max EID, TRY NOT TO USE NATIVE QUERY HERE
// set entities EID with incremented result
// save
entityManager.persist(entity)
entityManager.flush() // -> Force an actual INSERT
// unlock by passing the previous entity
entityManager.lock(lockedEntity, LockModeType.NONE)