Symfony2中Doctrine使用Oracle SEQUENCE作为主键生成策略失效问题
解决步骤
根因说明
该报错是Doctrine未正确解析到你配置的SEQUENCE主键生成策略,默认要求你手动给主键字段赋值导致的。
1. 修复实体重复注解问题
你的实体类头部重复定义了@ORM\Entity注解,会导致元数据解析异常,优先读取到无附加配置的空注解,覆盖后续的策略配置,将两行合并即可:
/** * @ORM\Table(name="CONTRATO") * @ORM\Entity(repositoryClass="PSBundle\Entity\ContratoRepository") */ class Contrato
2. 补全序列生成器配置
Doctrine ORM 2.3版本对Oracle序列的解析要求严格,如果你连接Oracle的用户和序列所属的Schema不一致,需要给序列名补全Schema前缀,同时确保大小写和Oracle内的序列名完全匹配:
/** * @var integer * * @ORM\Column(name="ID_CONTRATO", type="integer") * @ORM\Id * @ORM\GeneratedValue(strategy="SEQUENCE") * @ORM\SequenceGenerator(sequenceName="[你的Schema名].SID_CONTRATO", allocationSize=1, initialValue=1) */ private $idContrato;
如果序列属于当前连接用户,无需填写Schema前缀,直接确认SID_CONTRATO拼写无误即可。
3. 补充Doctrine ORM配置
在config.yml的doctrine.orm配置段补充如下内容,适配Oracle的元数据解析:
doctrine: orm: auto_generate_proxy_classes: %kernel.debug% auto_mapping: true # 新增以下配置 quote_strategy: doctrine.orm.quote_strategy.default entity_managers: default: connection: default
4. 清空缓存验证
Symfony 2会缓存实体元数据,修改完配置和注解后必须清空缓存才能生效:
# 开发环境清空缓存 php app/console cache:clear # 生产环境清空缓存 php app/console cache:clear --env=prod --no-debug
临时规避方案
如果修改后还是报错,可手动获取序列值赋值给主键,不影响业务运行:
// 先获取序列下一个值 $nextId = $em->getConnection()->fetchAssoc('SELECT SID_CONTRATO.NEXTVAL AS ID FROM DUAL')['ID']; $entityContrato->setIdContrato($nextId); // 再执行持久化 $em->persist($entityContrato);
内容的提问来源于stack exchange,提问作者Genarito
相关产品推荐
相关产品推荐

