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

Doctrine2 gives me wrong sequence numbers (overflow)

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

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

我的问题是:我可以在不修改核心的情况下改变 Doctrine 用来读取序列号的数据类型吗?如果没有,您知道如何解决这个问题吗?请记住,我无法更改数据库或序列号格式。

我已经解决了问题。

首先,我定义了一个自定义 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(),returns 一个字符串,其名称为 Oracle 数据库中 table 的序列.

最后,在所有需要的实体中,我更改了 id 注释:

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