Doctrine2给了我错误的序列号(溢出)

时间:2015-03-05 08:06:53

标签: symfony doctrine-orm integer-overflow

我正在使用Symfony2,并且我使用@ORM\GeneratedValue(strategy="AUTO")@ORM\SequenceGenerator(sequenceName="mysequence_seq")定义了一些实体。我的序列使用了非常大的数字:它们被定义为数字(22)。

我遇到的问题是Symfony将此值作为整数获取,这是错误的,因为这些数字不适合单个32位值。正常的序列号可以是1035000000000000000031035是某种表格标识符,另一个是序列号码。不要问我为什么,我们已经继承了这个数据库)。但Doctrine将此数字设为2147483647(2 ^ 31 - 1),这会打破序列号并产生PK错误。

我的问题是:我可以改变Doctrine用于读取序列号而不修改核心的数据类型吗?如果没有,你对如何解决这个问题有任何想法吗?请记住,我无法更改数据库或序列号格式。

1 个答案:

答案 0 :(得分: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 anotations:

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