我们有一些通过EDL建模的自定义对象,这些自定义对象具有系统Intershop对象(ISPRODUCT和ISORDER)的外键。当引用的订单或产品被删除时,我们需要删除对象。
这是EDL文件的摘录:
/**
* Relation to product PO (tariff item)
*/
dependency tariff: ProductPO
{
foreign key(tariffID);
}
/*
* Order relation
*/
dependency order: OrderPO
{
foreign key(orderID);
}
如我所见,可以在EDL关系上添加删除操作,但不能在依赖项上添加删除操作。
我们目前正在做的就是修改生成的dbconstraints.oracle.ddl文件中的语句,如下所示:
EXEC staging_ddl.add_constraint('A1APPLICATIONFORM', 'A1APPLICATIONFORM_CO_003', 'FOREIGN KEY (TARIFFID) REFERENCES PRODUCT (UUID) ON DELETE SET NULL INITIALLY DEFERRED DEFERRABLE DISABLE NOVALIDATE');
EXEC staging_ddl.add_constraint('A1APPLICATIONFORM', 'A1APPLICATIONFORM_CO_004', 'FOREIGN KEY (ORDERID) REFERENCES ISORDER (UUID) ON DELETE CASCADE INITIALLY DEFERRED DEFERRABLE DISABLE NOVALIDATE');
但这只是临时解决方法,因为每次我们在EDL上重新启动代码生成器时,这些文件都会被覆盖。
打开关系可以定义如下删除操作:
relation promotionBenefitPOs : A1PromotionBenefitPO[0..n] inverse promotionPO implements promotionBenefits delete default;
是否可以在与系统对象的依赖关系上实现相同的目标?
答案 0 :(得分:2)
我不知道使用EDL可以做到这一点,很高兴知道。我用这种方法的问题是,orm缓存不知道oracle正在删除这些对象,因此它可能使幻影对象在orm缓存中浮动。
我将使用此register listener解决方案删除这些对象,以便所有内容都被更新并从缓存中清除。
我确实想知道代码生成器如何处理关系上的这个delete属性。
答案 1 :(得分:1)
恐怕您需要手动执行此操作。意味着一旦删除了所涉及类型的实例,则需要查询自定义胶水对象,然后通过自己的操作将其删除。由于依赖关系只是orm无法自动删除的弱(单向)关系。 有关EDL依赖性的文档,请参见此处:https://support.intershop.com/kb/index.php/Display/247P28
例如,我检查了ProcessPagelet-Delete pipline。在此,我们首先从Label
中取消分配(即删除分配)Pagelet
个对象。 PageletLabelAssingmentPO
包含对Pagelet
的依赖关系,如您在此处看到的那样:
orm class PageletLabelAssignmentPO extends LabelAssignmentPO
{
attribute pageletUUID : uuid;
dependency pagelet : PageletPO
{
foreign key(pageletUUID);
}
}