protected void handleOptimisticLockingException(DbOperation dbOperation) {
    boolean isHandled = false;

    if (optimisticLockingListeners != null) {
      for (OptimisticLockingListener optimisticLockingListener : optimisticLockingListeners) {
        if (optimisticLockingListener.getEntityType() == null
            || optimisticLockingListener
                .getEntityType()
                .isAssignableFrom(dbOperation.getEntityType())) {
          optimisticLockingListener.failedOperation(dbOperation);
          isHandled = true;
        }
      }
    }

    if (!isHandled) {
      throw LOG.concurrentUpdateDbEntityException(dbOperation);
    }
  }