Doctrine2继承 - 1452:完整性约束违规

时间:2012-06-11 14:02:20

标签: php inheritance symfony doctrine-orm mysql-error-1452

我在新服务器上部署了我的项目并且错误" SQLSTATE [23000]:完整性约束违规:1452无法添加或更新子行:外键约束失败"当我尝试使用继承INSERT类时显示:

/**
 * @ORM\Table(name="prosante")
 * @ORM\Entity
 */

class ProSante extends Base
{

    /**
     * @ORM\Column(type="string")
     */
    protected $firstName;
}


/**
 * @ORM\Table(name="base")
 * @ORM\Entity(repositoryClass="Test\MyBundle\Entity\BaseRepository")
 * @ORM\InheritanceType("JOINED")
 * @ORM\DiscriminatorColumn(name="discr", type="string")
 * @ORM\DiscriminatorMap({"base" = "Base",
 *                        "prosante" = "ProSante",
 *                        "pharmacie" = "Pharmacie"})
 */

abstract class Base
{
    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;
}

记录:

[2012-06-11 15:42:46] doctrine.DEBUG: INSERT INTO base (name) VALUES (?) ({"1":"Blabla"}) [] []
[2012-06-11 15:42:46] doctrine.DEBUG: INSERT INTO prosante (id, firstname) VALUES (?, ?) ({"1":"0","2":"PATRICK"}) [] []

我不知道该怎么做,因为当我在localhost上执行相同的INSERT时,错误并没有显示出来。

修改 我检查" SELECT LAST_INSERT_ID();"在manualy插入一个新的" Base"进入我的数据库,它不会返回0,我不明白。

解决方案这是一个驱动程序问题,我改变了它并且有效。

2 个答案:

答案 0 :(得分:1)

似乎主义是将“Base”解释为自己的表。我想你想要实现的是将你的Base类作为映射的超类。

要执行此操作,只需将其标注为:

@MappedSuperclass

然后你可以安全地将它扩展到你的其他实体..

http://docs.doctrine-project.org/projects/doctrine-orm/en/2.0.x/reference/inheritance-mapping.html#mapped-superclasses

答案 1 :(得分:0)

我遇到了类似的问题,并花了大量时间寻找其原因,因此我允许自己在这里分享我的解决方案,因为这是我在SO上发现的最接近的问题。希望这可以对某些人有所帮助:)

就我而言

尽管在第一个查询(对于基类)中自动生成的键已成功传递到第二个查询(对于子类)中,Doctrine引发了相同的外键约束冲突异常。由于存在约束冲突,第二个查询仍然失败,并且事务已回滚。

深入日志(我在CentOS上使用MariaDB),发现此错误:

[ERROR] Transaction not registered for MariaDB 2PC, but transaction is active

我的解决方案

事实证明,我的MariaDB服务未正确安装或更新(我不知道,其他人确实做到了)。

运行mysql_upgrade解决了我的问题。