我正在使用Symfony2,并且我使用@ORM\GeneratedValue(strategy="AUTO")
和@ORM\SequenceGenerator(sequenceName="mysequence_seq")
定义了一些实体。我的序列使用了非常大的数字:它们被定义为数字(22)。
我遇到的问题是Symfony将此值作为整数获取,这是错误的,因为这些数字不适合单个32位值。正常的序列号可以是103500000000000000003
(1035
是某种表格标识符,另一个是序列号码。不要问我为什么,我们已经继承了这个数据库)。但Doctrine将此数字设为2147483647(2 ^ 31 - 1),这会打破序列号并产生PK错误。
我的问题是:我可以改变Doctrine用于读取序列号而不修改核心的数据类型吗?如果没有,你对如何解决这个问题有任何想法吗?请记住,我无法更改数据库或序列号格式。
答案 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")