我正在使用类表继承策略用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…)。
对我来说,问题似乎是你所指的类名。
类名的字符串表示总是指向根名称空间,因此在开头包含“\”只会给您带来麻烦。
我建议你把它取下来检查一下是否有效。

08-18 23:21