Что за DoctrineHydrator? Я у себя только DoctrineObject нашел, всегда его и использовал.
Как происходит гидрация через DoctrineObject - Doctrine получает метадату для сущности которую вы гидрируете, и итерируясь по массиву переданому в hydrate обрабатывает только записи ключи которых есть в св-вах сущности. При обработки каждого ключа массива гидратор проверяет - связь ли это, и если связь то какая: в нём есть два метода для гидрации данных по связям: toOne() и toMany(), так как у вас судя по схеме ManyToMany вызовется метод toMany(), я его сюда скопирую:
// If the collection contains identifiers, fetch the objects from database
foreach ($values as $value) {
if ($value instanceof $target) {
$collection[] = $value;
} elseif ($value !== null) {
$targetObject = $this->find($value, $target);
if ($targetObject !== null) {
$collection[] = $targetObject;
}
}
}
Как видите он умеет работать только с 2 видами данных:
1) с набором ID (тогда он сам ищет сущность, и проставляет связи)
2) с набором сущностей
В вашем случае передается набор массивов, поэтому не работает.
Чтобы заработало, нужно использовать гидратор в том числе и для Fieldset'а, тогда в момент когда будет гидрироваться основная форма элементы уже будут сгидрированы, и вместо массива массивов toMany() получит массив сущностей.