Наследование Doctrine2 - 1452: нарушение ограничения целостности

Я развернул свой проект на новом сервере, и появляется ошибка "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 на localhost.

РЕДАКТИРОВАТЬ Я проверяю "SELECT LAST_INSERT_ID();" после ручной вставки новой "базы" в мою базу данных, она не возвращает 0, я не понимаю.

РЕШЕНИЕ Это была проблема с драйвером, я меняю ее, и она работает.

1 ответ

Похоже, доктрина интерпретирует "База" как свою собственную таблицу. Я думаю, что вы хотите достичь здесь, чтобы ваш базовый класс был отображен как суперкласс.

Для этого просто аннотируйте это как:

@MappedSuperclass

И тогда вы можете безопасно распространить его на других ваших сущностей..

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

У меня возникла аналогичная проблема, и я потратил много времени на поиск ее причины, поэтому я позволяю себе поделиться своим решением здесь, поскольку это самый близкий вопрос, который я нашел на SO. Надеюсь, это поможет некоторым людям:)

В моем случае

Doctrine выдавала то же исключение нарушения ограничения внешнего ключа, хотя автоматически сгенерированный ключ в первом запросе (для базового класса) был успешно передан второму запросу (для подкласса). Второй запрос все еще завершался ошибкой из-за нарушения этого ограничения, и транзакция была отменена.

Копаясь в журналах (я использую MariaDB на CentOS), я обнаружил такую ​​ошибку:

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

Мое решение

Оказалось, что моя служба MariaDB была неправильно установлена ​​или обновлена ​​(я точно не знаю, это сделал кто-то другой).

Бег mysql_upgrade решил мою проблему.

Другие вопросы по тегам