【问题标题】:Doctrine2 inheritance - 1452 : Integrity constraint violationDoctrine2 继承 - 1452:违反完整性约束
【发布时间】:2012-06-14 10:46:48
【问题描述】:

我在新服务器上部署了我的项目,当我尝试插入具有继承的类时出现错误“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"}) [] []

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

编辑 我检查“SELECT LAST_INSERT_ID();”手动将新的“Base”插入我的数据库后,它不返回 0,我不明白。

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

【问题讨论】:

  • 你能解释一下这个问题吗?我遇到了同样的事情。

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


【解决方案1】:

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

就我而言

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

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

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

我的解决方案

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

运行 mysql_upgrade 解决了我的问题。

【讨论】:

    【解决方案2】:

    似乎学说将“Base”解释为它自己的表。我认为您想要在这里实现的是将您的 Base 类作为映射的超类。

    要做到这一点,只需将其注释为:

    @MappedSuperclass

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

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

    【讨论】:

    • 我希望教义将 Base 作为它自己的表,因为我使用“类表继承”:docs.doctrine-project.org/projects/doctrine-orm/en/2.0.x/… 但它在插入时失败了
    • 啊,我明白了,看看那些实体的“显示创建表”,看看你是否可以计算出放置的外键约束,以及它们为什么会在那里。抱歉,我无法提供更多帮助。
    • 好的好的,无论如何谢谢,但是外键约束看起来还可以,但是日志很奇怪,就像学说不知道最后插入的 id。
    猜你喜欢
    • 2016-08-11
    • 2015-11-27
    • 2016-05-25
    • 2021-07-23
    • 1970-01-01
    • 2020-01-14
    • 2019-01-22
    • 2021-12-13
    相关资源
    最近更新 更多