Intershop EDL моделирование - Как добавить зависимость от каскадного удаления - PullRequest
0 голосов
/ 24 сентября 2018

У нас есть несколько пользовательских объектов, смоделированных через 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;

Можно ли добиться того же призависимость от системных объектов?

Ответы [ 2 ]

0 голосов
/ 25 сентября 2018

Я не знал, что это возможно с EDL, приятно знать.Моя проблема с этим подходом состоит в том, что кеш orm не знает, что эти объекты удаляются оракулом, поэтому он может иметь фантомный объект, плавающий в кеше orm.

Я бы использовал это решение register listener для удаления этих объектов, чтобы все обновлялось и выгружалось из кэша.

Мне интересно, как работает генератор кодаэто удалить свойство по отношению.

0 голосов
/ 25 сентября 2018

Боюсь, вам нужно сделать это вручную.Это означает, что после удаления экземпляра соответствующих типов вам нужно запросить свой пользовательский объект склеивания и удалить его как последующее собственное действие.Поскольку зависимость - это просто слабое (однонаправленное) отношение, которое orm не может автоматически удалить.См. Здесь документацию по EDL-зависимости: https://support.intershop.com/kb/index.php/Display/247P28

Например, я проверил трубопровод ProcessPagelet-Delete.Там мы сначала отменяем назначение (, т.е. удаляем присвоение ) Label объектов из Pagelet, которые необходимо удалить.PageletLabelAssingmentPO содержит зависимость от Pagelet, как вы можете видеть здесь:

orm class PageletLabelAssignmentPO extends LabelAssignmentPO
{
    attribute pageletUUID : uuid;

    dependency pagelet : PageletPO
    {
        foreign key(pageletUUID);
    }
}
...