我在条令中创建继承对象时遇到问题。。。我现在第一次使用教义。。。
一些细节:sql数据库:SQL
DescribeableVersionedEntity是每个Entity继承的超类(继承类型Joined)。(所以我必须使用类继承,是吗?)
实体:
实体
执行代码:
$owner = $this->getEntityManager()->getRepository('ChecklistCoreEntityOwner')->find(3);
$layout = new Layout();
//Add some Attributes... (not listed here)
$layout->owner = $owner;
$translLayout = new Translation($layout);
$translLayout->text = "Translation Layout";
$cl = new Checklist($layout);
$cl->changeNoteComment = "new ChecklistComment";
$cl->owner = $owner;
$translChecklist = new Translation($cl);
$translChecklist->text = "Translation Checklist";
$userChapter = new UserChapter($cl);
$userChapter->owner = $owner;
$userChapter->isActive = true;
$translUserChapter = new Translation($userChapter);
$translUserChapter->text = "Translation UserChapter";
和错误SQL/Message:
文件:
C:Program Files (x86)ZendApache2htdocsChecklistSystemvendordoctrinedballibDoctrineDBALDBALException.php:91
消息:
An exception occurred while executing 'INSERT INTO translation (language, text, describableVersionedEntity) VALUES (?, ?, ?)' with params [null, "Translation UserChapter", null]:
SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'describableVersionedEntity' cannot be null
我读过,外键(例如在UserChapter中)必须链接到Top-第一个Parent。在我的例子中,继承路径是:
DescribableVersionedEntity->ChecklistElement->Chapter->UserChapter
因此,我有3个抽象的"父"类,最后一个是可用对象UserChapter。在SQL中,我为每个实体创建了一个表,并使用继承类型"Joined"。
所以下一个问题是:我必须在原则上宣布下一个顶级实体还是顶级实体中的顶级实体为外键?
next-top: UserChapter(FK_UserChapter_Chapter), Chapter(FK_Chapter_ChecklistElement), ChecklistElement(FK_ChecklistElement_DVE) or
top-of-the-top: UserChapter(FK_UserChapter_DescribableVersionedEntity)
我想我必须使用顶部的顶部,因为我不需要创建一个章节对象,例如(如果是UserChapter对象)
那么:我的体系结构在原理上与MySql数据库兼容吗?如果是-为什么创建翻译时出现问题,导致descriptableVersionedEntity为null??
我希望有人能帮助我,我在stackoverflow找不到合适的解决方案。。我很确定这是一个关键问题。。。
提前感谢!!
您必须将UserChapter
类添加到DescribableVersionedEntity
的DiscriminatorMap
中。
* @ORMDiscriminatorMap({"describableversionedentity" = "DescribableVersionedEntity", "checklist" = "Checklist", "layout" = "Layout", "checklistelement" = "ChecklistElement", "footnote" = "Footnote", "contentelement" = "ContentElement", "userchapter" = "UserChapter"})
规则是继承的根类(DescribableVersionedEntity
)必须包含DiscriminatorMap
中的所有子类,而不仅仅是直接子类。子类并没有定义DiscriminatorMap
,即使它们是其他类的基。因此,将DiscriminatorMap
内容从ChecklistElement
移动到根类-DescribableVersionedEntity