我在新服务器上部署了我的项目并且错误" 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,我不明白。
解决方案这是一个驱动程序问题,我改变了它并且有效。
答案 0 :(得分:1)
似乎主义是将“Base”解释为自己的表。我想你想要实现的是将你的Base类作为映射的超类。
要执行此操作,只需将其标注为:
@MappedSuperclass
然后你可以安全地将它扩展到你的其他实体..
答案 1 :(得分:0)
我遇到了类似的问题,并花了大量时间寻找其原因,因此我允许自己在这里分享我的解决方案,因为这是我在SO上发现的最接近的问题。希望这可以对某些人有所帮助:)
深入日志(我在CentOS上使用MariaDB),发现此错误:
[ERROR] Transaction not registered for MariaDB 2PC, but transaction is active
事实证明,我的MariaDB服务未正确安装或更新(我不知道,其他人确实做到了)。
运行mysql_upgrade
解决了我的问题。