gpt4 book ai didi

orm - 如何在Intershop7中注册ORMObjectListener

转载 作者:行者123 更新时间:2023-12-04 15:46:12 25 4
gpt4 key购买 nike

我们在网上商店实现中实现了多个自定义 ORM 对象,这些对象引用(依赖)Intershop Product 系统对象。

当用户尝试删除后台中的某个产品时,会导致问题,因为对该产品的引用可能仍然存在于我们的自定义对象中。当然,删除从我们的自定义对象之一引用的产品会生成如下异常:

java.sql.SQLTransactionRollbackException: ORA-02091: transaction rolled back ORA-02292: integrity constraint (INTERSHOP.A1POSTPAIDPRICE_CO_002) violated - child record found  

我们发现可以通过实现 ORMObjectListener 并重写 objectDeleting 方法来解决这个问题,以便在产品实际删除之前删除所有引用。

ORM 层状态的 Intershop 食谱:

“实例必须为给定的 ORM 对象类型实现 ORMObjectListener 接口(interface)并在工厂注册。当创建、更改或删除给定类型的实例时,将调用监听器。”

( https://support.intershop.com/kb/index.php/Display/2G3270#Cookbook-ORMLayer-Recipe:NotificationofPersistentObjectChanges )

但是,我们找不到用于在工厂注册监听器的说明书。我们需要做什么来注册监听器?

此外,如果有更好的方法来处理删除事件期间自定义对象对系统对象的依赖关系,我愿意接受建议。

更新:

这是我迄今为止尝试过的监听器类:

public class ProductDeleteListener implements ORMObjectListener<ProductPO> {

@Inject
ProductPOFactory productPOFactory;

/** The Constant LOGGER. */
private static final Logger LOGGER = LoggerFactory.getLogger(ProductDeleteListener.class);

public ProductDeleteListener() {
productPOFactory.addObjectListener(this, new AttributeDescription[0]);
}

@Override
public boolean isOldStateNeeded() {
// TODO Auto-generated method stub
return false;
}

@Override
public void objectChanged(ProductPO object, Map<AttributeDescription, Object> previousValues) {
if (LOGGER.isDebugEnabled()) {
LOGGER.debug("PRODUCT LISTENER TEST - CHANGE");
}

}

@Override
public void objectChanging(ProductPO object, Map<AttributeDescription, Object> previousValues) {
// TODO Auto-generated method stub

}

@Override
public void objectCreated(ProductPO object) {
// TODO Auto-generated method stub

}

@Override
public void objectCreating(ProductPO object) {
// TODO Auto-generated method stub

}

@Override
public void objectDeleted(ORMObjectKey objectKey) {
// TODO Auto-generated method stub

}

@Override
public void objectDeleting(ProductPO object) {
if (LOGGER.isDebugEnabled()) {
LOGGER.debug("PRODUCT LISTENER TEST - PRE DELETE");
}

}

}

但是它不起作用。当对象更改或删除时,不会记录任何内容。

最佳答案

除了 Willem Evertse 编写的内容之外,您还需要将注册代码放入通过 Intershop 组件框架实例化的类中。

实现.组件:

<components xmlns="http://www.intershop.de/component/2010" scope="global">
<implementation name="ProductDeleteListenerRegistrar"
class="your.fullqualifed.ProductDeleteRegistrar" start="start" stop="stop"></implementation>

实例.组件:

<components xmlns="http://www.intershop.de/component/2010"> <instance name="ORMValidator" with="ORMValidator" scope="global"/></components>

您需要编写一个类,例如ProductDeleteRegistrar 并提供启动方法,您可以在其中添加注册调用,如 Willem 所描述的。至于 stop 方法,您需要安全地注销您的对象监听器。确保这两个方法都声明为同步。

关于orm - 如何在Intershop7中注册ORMObjectListener,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51516296/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com