2015-03-05 4 views
2

Я использую Symfony2, и у меня есть некоторые объекты, определенные с @ORM\GeneratedValue(strategy="AUTO") и @ORM\SequenceGenerator(sequenceName="mysequence_seq"). Мои последовательности используют очень большие числа: они определены как числовые (22).Doctrine2 дает мне неправильные порядковые номера (переполнение)

Проблема заключается в том, что Symfony извлекает эти значения в виде целых чисел, и это неправильно, потому что эти числа не соответствуют одному 32-битовому значению. Нормальным порядковым номером может быть 103500000000000000003 (1035 - это какой-то идентификатор таблицы, а другой - последовательность. Не спрашивайте меня, почему мы унаследовали эту базу данных). Но Doctrine принимает это число как 2147483647 (2^31 - 1), и это нарушает порядковые номера и порождает ошибки PK.

Мой вопрос: могу ли я изменить тип данных, который Doctrine использует для чтения порядковых номеров без изменения ядра? Если нет, можете ли вы представить себе, как решить эту проблему? Имейте в виду, что я не могу изменить базу данных или формат порядкового номера.

ответ

1

Я решил проблему.

Во-первых, я определил генератор пользовательских ID:

class MyIdGenerator extends AbstractIdGenerator 
{ 
    public function generate(EntityManager $em, $entity) 
    { 
     $stmt = $em->getConnection()->prepare(sprintf('SELECT %s.nextval id FROM DUAL', $entity->getGeneratorName())); 
     $stmt->execute(); 
     $rs = $stmt->fetch(); 

     return $rs['ID']; 
    } 

}

Как вы можете видеть, во всех моих сущностей я определил функцию getGeneratorName(), которая возвращает строку с именем последовательности таблицы в Oracle DB.

Наконец, во всех необходимых сущностях Я изменил ID АННОТАЦИЯ:

@ORM\Entity 
@ORM\Id 
@ORM\GeneratedValue(strategy="CUSTOM") 
@ORM\SequenceGenerator(class="Acme\BaseBundle\MyIdGenerator")