1

我在新服务器上部署了我的项目,当我尝试插入具有继承的类时出现错误“SQLSTATE [23000]:完整性约束违规:1452 无法添加或更新子行:外键约束失败”:

/**
 * @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"}) [] []

我不知道该怎么做,因为当我在本地主机上执行相同的 INSERT 时错误不会出现。

编辑 我检查“SELECT LAST_INSERT_ID();” 在我的数据库中手动插入一个新的“基础”后,它不返回 0,我不明白。

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

4

2 回答 2

1

看来学说正在将“基地”解释为自己的表格。我认为您想要在这里实现的是将您的 Base 类作为映射的超类。

为此,只需将其注释为:

@MappedSuperclass

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

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

于 2012-06-11T14:16:33.837 回答
0

我遇到了一个非常相似的问题,并花了很多时间寻找它的原因,所以我允许自己在这里分享我的解决方案,因为这是我在 SO 上找到的最接近的问题。希望这可以帮助一些人:)

就我而言

尽管第一个查询(对于基类)中自动生成的键已成功传递给第二个查询(对于子类),但 Doctrine 抛出了相同的外键约束违规异常。第二个查询仍然因违反此约束而失败,并且事务已回滚。

挖掘日志(我在 CentOS 上使用 MariaDB),我发现了这个错误:

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

我的解决方案

原来我的 MariaDB 服务安装或更新不正确(我不确切知道,是其他人做的)。

跑步mysql_upgrade解决了我的问题。

于 2020-01-08T09:16:18.047 回答