2

我们有一些通过 EDL 建模的自定义对象,这些对象具有系统 Intershop 对象(ISPRODUCT 和 ISRDER)的外键。当引用的订单或产品被删除时,我们需要删除我们的对象。

这是 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;

是否可以对系统对象的依赖关系实现相同的目标?

4

2 回答 2

2

我不知道 EDL 可以做到这一点,很高兴知道。我对这种方法的问题是 orm 缓存不知道这些对象正在被 oracle 删除,因此它可能有幻像对象在 orm 缓存中浮动。

我将使用此注册侦听器解决方案来删除这些对象,以便更新所有内容并将其从缓存中清除。

我确实想知道代码生成器如何处理关系上的这个删除属性。

于 2018-09-25T08:16:00.033 回答
1

恐怕你需要手动完成。这意味着一旦删除了所涉及类型的实例,您需要查询您的自定义胶水对象并通过您自己的后续操作删除该对象。因为依赖只是 orm 无法自动删除的弱(单向)关系。有关 EDL 依赖性的文档,请参见此处:https: //support.intershop.com/kb/index.php/Display/247P28

例如,我检查了 ProcessPagelet-Delete 管道。在那里,我们首先从要删除的对象中取消分配(即删除分配Label对象。包含一个依赖项,如您在此处看到的PageletPageletLabelAssingmentPOPagelet

orm class PageletLabelAssignmentPO extends LabelAssignmentPO
{
    attribute pageletUUID : uuid;

    dependency pagelet : PageletPO
    {
        foreign key(pageletUUID);
    }
}
于 2018-09-25T08:05:35.300 回答