Дискриминатор проблемы с Доктриной 2 - PullRequest
3 голосов
/ 03 мая 2011

Я реализую отображение наследования с помощью D2, используя стратегию наследования таблиц классов.У меня есть родительский класс с именем Person со следующим блоком кода

namespace Zain\Entity;
/**
 * @Entity
 * @InheritanceType("JOINED")
 * @DiscriminatorColumn(name="Specialty", type="string") // what other types exist?
 * @DiscriminatorMap({"person" = "\Zain\Person", "employee" = "\Staff\Entities\Employee"})
 *  
 * @Table(name="db_One.tblPerson")
 *
 */
class Person
{

...

И у меня есть дочерний класс с именем Employee со следующим кодом:

namespace Staff\Entities;

/**
 * Description of Employee
 * @Entity
 * @Table(name="db_Two.tblEmployee")
 * 
 */

class Employee extends \Zain\Entity\Person
{

...

Таблица MySQL: tblPerson имеетДискриминатор Столбец с именем Specialty определен как:

`Specialty` varchar(45) NOT NULL

Проблема возникает, когда у меня есть экземпляр Employee и я пытаюсь его сохранить.

Когда экземпляр Employee сохраняется, я ожидаю, что объектимя, сотрудник (строка) будет сохранен в столбце Специальность таблицы Person.Однако этого не произошло.Я сталкиваюсь с сообщением об ошибке:

Message: SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'specialty' cannot be null

Я понимаю, что эта ошибка означает, что для столбца Specialty в выражении SQL, созданном и используемом EntityManager, не передается значение.И я установил ограничение Not Null для столбца tblPerson> Specialty.

Если я удалил ограничение not null, я могу заставить это работать - но это противоречит цели.Чтобы помочь с этим, не могли бы вы показать мне, как получить сгенерированный оператор SQL, который используется / будет использоваться менеджером сущностей во время постоянного вызова?

Было бы здорово иметь хороший конец для парыдней поиска ответов.Еще раз спасибо.

1 Ответ

2 голосов
/ 03 мая 2011

Доктрина поддерживает множество типов. Основные используемые в DiscriminatorMap строковые и целочисленные (и его производные: bigint, smallint, float, ...).

Ну, мне кажется, проблема в названии класса, на которое вы ссылаетесь. Строковые представления имени класса всегда указывают на корневое пространство имен, поэтому включение «\» в начале только доставляет вам неприятности. Я бы посоветовал вам удалить его и проверить, работает ли он.

...