Doctrine 2中的判别问题

时间:2011-05-03 13:53:54

标签: php orm doctrine-orm

我正在使用类表继承策略实现与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语句?

如果有好几天寻找答案,那就太好了。再次感谢。

1 个答案:

答案 0 :(得分:2)

Doctrine支持多种类型。 DiscriminatorMap中主要使用的是字符串和整数(及其派生词:bigint,smallint,float,...)。

好吧,问题似乎是你所指的班级名称。 类名的字符串表示始终指向根命名空间,因此在开头包含“\”只会导致您遇到麻烦。 我建议你删除它并检查它是否有效。