Doctrine 2中的鉴别器问题

3

我正在使用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
{

...

我是一位有用的助手,可以为您翻译以下内容。

我有一个名为员工的子类,其代码如下:

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(字符串)会保存在表Person的Specialty列中。然而,这并没有发生。我遇到了一个错误信息:
Message: SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'specialty' cannot be null

我明白这个错误的意思是在EntityManager生成和使用的SQL语句中,没有传递Specialty列的任何值。而且我在tblPerson > Specialty列上设置了NotNull约束。
如果我删除NotNull约束,则可以使其正常工作 - 但这并不符合目的。在帮助解决问题时,您能否请告诉我如何检索persist调用期间实体管理器使用/将要使用的生成的SQL语句?
在经过几天的寻找答案后,有一个好的结局会很棒。再次感谢。
1个回答

2

Doctrine支持各种类型。在DiscriminatorMap中,主要使用的是字符串和整数(以及其衍生物:bigint、smallint、float等)。

对我来说,问题似乎是您所引用的类名。 类名的字符串表示始终指向根命名空间,因此在开头包含“\”只会带来麻烦。 我建议您将其删除并检查是否有效。


然而,突出的请求是:在帮助解决这个问题时,你能否向我展示如何检索实体管理器在持久化调用期间使用/将要使用的生成的SQL语句? - pi.
@pi - 你需要为Doctrine配置一个SQL记录器。详情请见:http://www.doctrine-project.org/docs/orm/2.0/en/reference/configuration.html#sql-logger-optional - rojoca

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接