我正在使用类表继承策略实现与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的Discriminator Column定义为:
`Specialty` varchar(45) NOT NULL
当我有一个Employee实例并尝试持久化时会出现问题。
当持久化Employee实例时,我希望对象名称employee(string)将保存在表Person的Specialty列中。 然而,这并没有发生。我遇到一条错误消息:
Message: SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'specialty' cannot be null
我理解这个错误意味着EntityManager生成和使用的SQL语句中没有传递值的值。我在tblPerson上设置了一个Not Null约束>专业专栏。
如果我删除了非null约束,我可以让它工作 - 但这会破坏目的。在帮助解决这个问题时,您能否告诉我如何在持久调用期间检索实体管理器使用/要使用的生成的SQL语句?
如果有好几天寻找答案,那就太好了。再次感谢。
答案 0 :(得分:2)
Doctrine支持多种类型。 DiscriminatorMap中主要使用的是字符串和整数(及其派生词:bigint,smallint,float,...)。
好吧,问题似乎是你所指的班级名称。 类名的字符串表示始终指向根命名空间,因此在开头包含“\”只会导致您遇到麻烦。 我建议你删除它并检查它是否有效。