Спасибо за информацию, все осознал :)
Что в результате получилось:
entityA:
type: entity
table: tableName_A
id:
id:
type: integer
column: id
generator:
strategy: AUTO
manyToOne:
role:
targetEntity: entityB
joinColumn:
name: cityId
referencedColumnName: id
cascade: ["persist"]
Сущность entityB осталась без изменений.
При создании entityA, мне необходимо в поле $entityA->role положить entityB.
Раньше было - я создавал сущность руками:
$entityA->role = new entityB(//params);
Сейчас стало - получаю ссылку на сущность из доктрины:
$entityA->role = $em->getReference(entityB::class, $entityBId);
Таким образом при сохранении entityA доктрина проверяет, была ли изменена связная entityB и если она не была изменена (а она не была изменена или подменена, т.к. используется ссылка), то создания/обновления записи в таблице tableName_B не происходит.
В доках доктрины это так же сказано:
This concept is called Persistence by Reachability: New entities that are found on already managed entities are automatically persisted as long as the association is defined as cascade: persist.
Спасибо
Лексей Фельде за подсказку :)