我正在使用类表继承策略用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列,定义为:
`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语句中没有为Specialty列传递值。我在tblperson>specialty列上设置了非空约束。
如果我删除了not null约束,我就可以让它工作了——但这违背了目的。为了帮助解决这个问题,您能告诉我如何检索实体管理器在持久化调用期间使用/将要使用的生成的sql语句吗?
很高兴能结束几天的搜索。再次感谢。
最佳答案
教义支持多种类型。discriminatormap中主要使用的是string和integer(及其派生词:bigint、smallint、float…)。
对我来说,问题似乎是你所指的类名。
类名的字符串表示总是指向根名称空间,因此在开头包含“\”只会给您带来麻烦。
我建议你把它取下来检查一下是否有效。