Custom field validator comparing original and new values
Normally the original entity is stored in the entity object before the user input is applied. If not, you can get it via the loaded revision id, which is preserved when an entity is loaded to keep it save from changes:
if (isset($entity-&gt;original)) {
  $original = $entity-&gt;original;
}
else {
  $original = \Drupal::entityTypeManager()
    -&gt;getStorage($entity-&gt;getEntityTypeId())
    -&gt;loadRevision($entity-&gt;getLoadedRevisionId());
}

$value_original = $original-&gt;{$item-&gt;getFieldDefinition()-&gt;getName()}-&gt;value;