Наследование 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
решил мою проблему.